swift代码中#selector(Coordinator.handleTap(_:)))是什么意思?#selector是什么作用

86 阅读3分钟

#selector 是 Swift 中用于表示选择器(selector)的一种语法,它允许你将一个方法引用传递给某个函数(通常是与事件相关的函数,如 UITapGestureRecognizer 或其他 UIKit 控件的事件)。#selector 用于将目标方法与特定的动作进行关联。

1. Selector 的作用

在 iOS 开发中,很多 UI 事件(如按钮点击、手势识别等)是通过“消息发送”机制来处理的。每个事件都会被传递到一个方法,通常是一个响应事件的目标方法。#selector 让你能够指定这个方法,并通过事件触发它。

2. #selector(Coordinator.handleTap(_:)) 详解

在你的代码中,#selector(Coordinator.handleTap(_:)) 用于将 handleTap(_:) 方法关联到一个触摸事件,例如点击屏幕时触发的方法。具体来说:

  • #selector: 这是 Swift 的语法,表示“选择器”,用于选择一个方法。
  • Coordinator: 这是目标对象,即方法 handleTap(_:) 所在的类。在你的代码中,这个类是 Coordinator
  • handleTap(_:): 这是方法的名称,表示当触发点击事件时,会调用 handleTap 方法。
  • (_:): 这个符号表示方法接收一个参数,sender,通常是事件触发的对象(如手势识别器 UITapGestureRecognizer)。

3. 使用场景

在你的代码中,手势识别器 UITapGestureRecognizer 需要通过 #selector 指定一个方法,这样当用户点击时,手势识别器就会调用指定的方法。例如:

let tapGestureRecognizer = UITapGestureRecognizer(target: context.coordinator, action: #selector(Coordinator.handleTap(_:)))
  • target: context.coordinator:指定 tapGestureRecognizer 的目标是 Coordinator 类实例,即在 Coordinator 类中找到相应的方法。
  • action: #selector(Coordinator.handleTap(_:)):指定当用户点击时,调用 Coordinator 类中的 handleTap(_:) 方法。

4. Selector 和方法的关系

在 Objective-C 和 Swift 中,#selector 用来将方法和事件机制进行绑定。通常,目标对象需要有相应的方法来处理这个事件。handleTap(_:) 方法将作为响应事件的目标方法,接收手势识别器作为参数。

在使用 #selector 时,目标方法通常有一个参数,用于接收事件触发时的相关信息。对于手势识别器来说,这个参数通常是 UITapGestureRecognizer 对象,它包含了关于点击事件的详细信息(如点击位置、触摸点、状态等)。

示例:handleTap(_:) 方法

假设你的 handleTap(_:) 方法是如下所示:

@objc func handleTap(_ sender: UITapGestureRecognizer) {
    // 处理点击事件
    guard let arView = sender.view as? ARView else { return }
    
    // 获取点击位置的 raycast 结果
    let tapLocation = sender.location(in: arView)
    let results = arView.raycast(from: tapLocation, allowing: .existingPlane, alignment: .horizontal)
    
    // 如果有有效的 raycast 结果
    if let firstResult = results.first {
        // 处理放置物体
        let mesh = MeshResource.generateBox(size: 0.1)
        let material = SimpleMaterial(color: .gray, roughness: 0.15, isMetallic: true)
        let model = ModelEntity(mesh: mesh, materials: [material])
        
        // 将模型放置到触摸位置
        let modelAnchor = AnchorEntity(world: firstResult.worldTransform)
        modelAnchor.addChild(model)
        
        // 将模型锚点添加到 AR 视图
        arView.scene.anchors.append(modelAnchor)
    }
}

总结:

  • #selector 是用于指定某个方法的方法,常用于事件响应机制中(如手势识别、按钮点击等)。
  • 在你的代码中,#selector(Coordinator.handleTap(_:)) 使得 tapGestureRecognizer 能够识别用户点击并触发 Coordinator 类中的 handleTap(_:) 方法。
  • handleTap(_:) 方法会处理点击事件并在 AR 视图中放置物体。

如果你有更多关于 #selector 或其他问题,随时告诉我!