尝试在自定义 UIView 子类上使用点击识别器时出现 NSUncaughtException

Posted

技术标签:

【中文标题】尝试在自定义 UIView 子类上使用点击识别器时出现 NSUncaughtException【英文标题】:NSUncaughtException when trying to use tap recognizer on custom UIView Subclass 【发布时间】:2017-03-13 00:55:35 【问题描述】:

我的 viewController 上有几个 UIView,我想点击它们以将我带到不同的视图控制器。我有一个用于自定义 UIView 外观的自定义 UIView 子类,由于我无法从子类导航,我创建了一个委托协议,允许我从视图控制器导航

协议:

protocol TapDelegate 
  func viewWasTapped()

在视图控制器上我遵守了这个协议,创建了一个自定义子视图的实例(常量是图标),最后我创建了一个函数来导航到各种视图控制器:

func viewWasTapped() 
    print("icon was tapped")    

    if icons.tag == 0 

        let food_Tabs_VC = self.storyBoard.instantiateViewController(withIdentifier: String(describing: FoodTabsViewController.self)) as! FoodTabsViewController
        self.navigationController?.pushViewController(food_Tabs_VC, animated: true)

     else if icons.tag == 1 

        let movesVC = self.storyBoard.instantiateViewController(withIdentifier: String(describing: MovesViewController.self)) as! MovesViewController
        self.navigationController?.pushViewController(movesVC, animated: true)
     else if icons.tag == 2 

        let msgLogVC = self.storyBoard.instantiateViewController(withIdentifier: String(describing: MsgLogViewController.self)) as! MsgLogViewController
        self.navigationController?.pushViewController(msgLogVC, animated: true)

     else 

        let myWorldVC = self.storyBoard.instantiateViewController(withIdentifier: String(describing: MyWorldViewController.self)) as! MyWorldViewController
        self.navigationController?.pushViewController(myWorldVC, animated: true)
    


但是,当我尝试在我的自定义 UIView 子类中使用点击手势时,当我点击 UIView 时出现未捕获异常的错误,这里是点击手势代码:

let homeVC = HomeViewController()

let gesture = UITapGestureRecognizer(target: self, action:#selector(homeVC.viewWasTapped))
self.addGestureRecognizer(gesture)

感谢任何帮助

【问题讨论】:

那么异常到底是什么?什么是异常堆栈跟踪? 【参考方案1】:

代码行

let homeVC = HomeViewController()

let gesture = UITapGestureRecognizer(target: self, action:#selector(homeVC.viewWasTapped))
self.addGestureRecognizer(gesture)

对我来说看起来很可疑,因为最后一行暗示selfUIView 的某个子类。 viewWasTapped 选择器的目标应该是HomeViewController 类型。因此,您可能需要将第二行中的target 更改为homeVC

【讨论】:

以上是关于尝试在自定义 UIView 子类上使用点击识别器时出现 NSUncaughtException的主要内容,如果未能解决你的问题,请参考以下文章

如何让 UITableViewCell 在自定义 UIView 子类上调用 setHighlighted 或 setSelected?

UIView beginAnimations 在自定义属性上太快了

在自包含的自定义 UIView 子类中使用 .xib 文件进行原型设计

点击时如何对子类 UIView 执行操作?

手势识别器阻止触摸已结束

在 Storyboard 中设计的自定义 UITableViewCell 中的自定义 UIView