ios - 将选择器从 UIViewController 传递到 UIView

标签 ios swift

我创建了一个继承自 UIView 的自定义类 BlueView。 我的 UIViewController 中有一个方法,我想在用户点击 BlueView 时调用它。但是,每当我点击 BlueView 时,我的程序就会崩溃,但出现以下异常:

2019-09-15 23:06:14.960704-0400 DoubleViewApp[2418:70709] -[DoubleViewApp.BlueView handleBlueTapWithSender:]: unrecognized selector sent to instance 0x7f820cd06790

界面 View :

import UIKit

class BlueView: UIView {

  override init(frame: CGRect) {
    super.init(frame: frame)
    createSubview()
  }

  required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
    createSubview()
  }

  func createSubview() {
    print("createSubview from BlueView")
    backgroundColor = .blue

    let tap = UITapGestureRecognizer(target: self, action: #selector(handleTap(sender:)))
    addGestureRecognizer(tap)
  }

  func setTapGesture(action: Selector?) {
    let tap = UITapGestureRecognizer(target: self, action: action)
    addGestureRecognizer(tap)
  }

  @objc func handleTap(sender: UITapGestureRecognizer? = nil) {
    print("NO! DO NOT TAP THE BLUE SQUARE.")

  }

}

View Controller :

import UIKit

class ViewController: UIViewController {


  override func viewDidLoad() {
    super.viewDidLoad()
    print("Hello World")
    // Do any additional setup after loading the view.
    let bview = BlueView(frame: CGRect(x: 0, y: 0, width: 300, height: 300))
    let rview = RedView(frame: CGRect(x: 0, y: 300, width: 300, height: 300))
    view.addSubview(bview)
    view.addSubview(rview)

    bview.setTapGesture(action: #selector(handleBlueTap(sender:)))
  }


  @objc func handleBlueTap(sender: UITapGestureRecognizer? = nil) {
    print("This is a funny message.")
    //Todo: Present new ViewController
  }
}

最佳答案

您还必须为选择器设置正确的目标。目前,您将目标设置为 BlueView 实例,但您希望它成为 View Controller 。

class BlueView: UIView {

    ...

    func setTapGesture(target: Any?, action: Selector?) {
        addGestureRecognizer(UITapGestureRecognizer(target: target, action: action))
    }

    ...

}

& 然后你可以使用:

bview.setTapGesture(target: self, action: #selector(handleBlueTap(sender:)))

关于ios - 将选择器从 UIViewController 传递到 UIView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57949952/

相关文章:

ios - 使用 pod 时没有生成 xcworkspace

ios - Swift: View 隐藏按钮

ios - 关闭 Sprite Kit 游戏时如何保持单例?

ios - 获取 iPhone 麦克风数据以通过 Socket 进行流式传输

ios - kCATransitionPush 应用于从 UIImageview 滑入/滑出图像,没有淡入淡出/透明效果 iOS

ios - UIImage不透明png文件

ios无法显示数据库中的图像

swift - 带图片的 UICollectionView

ios - Facebook 应用邀请 Swift 无通知

swift - 将 Int 保存到核心数据中的正确方法?