UITapGestureRecognizer崩溃App ..?

时间:2017-09-15 03:13:43

标签: swift swift3 uiimageview uigesturerecognizer uitapgesturerecognizer

我正在使用图片视图来显示用户的好友列表。用户应该能够点击朋友的图标并被带到另一个屏幕。我编写的代码在Xcode模拟器上完美运行。但是,在设备上运行时,只要点击一个图标,应用就会每次都崩溃。

我真的不确定在哪里开始调试这个,即使经过大量的谷歌搜索。任何建议/帮助表示赞赏。

我已经读过我的特定错误可能与内存分配有关(?)但仍不确定从哪里开始/做什么。当我检查设备日志时,异常类型显示:异常类型:EXC_BAD_ACCESS(SIGSEGV)。我已经按照有关寻找僵尸的教程进行操作,但没有帮助。谢谢。

我不确定要发布什么代码,但是因为你可能想要确保我正确设置图标:(我删除了一些代码以尽可能简化;这是在运行创建x个图标的循环)

let iv = UIImageView()
iv.translatesAutoresizingMaskIntoConstraints = false
iv.image = image!
iv.tag = j
iv.isUserInteractionEnabled = true

let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(self.iconTapped))
iv.isUserInteractionEnabled = true
iv.addGestureRecognizer(tapGestureRecognizer)

iconTapped功能:

func iconTapped(gestureRecognizer: UITapGestureRecognizer, _ sender: AnyObject) {
    print("TAPPED NUMBER: \(gestureRecognizer.view?.tag)")

    tappedIcon = CurrentSixFriendsList[(gestureRecognizer.view?.tag)!]

    let nextVC = ConfirmOpponentViewController()
    nextVC.chosenOpponent = tappedIcon
    navigationController?.pushViewController(nextVC, animated: true)
}

更新 我已经注释掉了nextVC上的所有代码以及iconTapped中除print参数之外的所有代码。只有当我点按任何朋友图标时,该应用仍会在设备上崩溃。

  func iconTapped(gestureRecognizer: UITapGestureRecognizer, _ sender: AnyObject) {

    print("tapped")

}

第二次更新: 所以我注释掉了渲染图像视图的所有代码,并对图像视图进行了硬编码。 (只有一个图像视图)带有我项目中的静态图像。即使我点击此图像查看,图像视图也会显示并且应用程序崩溃。为什么它表现得如此奇怪!?我要疯了... 我在VDL中添加了这段代码,仅用于实验:

 let iv = UIImageView()
    iv.isUserInteractionEnabled = true
    iv.translatesAutoresizingMaskIntoConstraints = false
    iv.image = #imageLiteral(resourceName: "settings icon")
    view.addSubview(iv)
    iv.widthAnchor.constraint(equalToConstant: 100).isActive = true
    iv.heightAnchor.constraint(equalToConstant: 100).isActive = true
    iv.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
    iv.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true

    let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(iconTapped))
    iv.addGestureRecognizer(tapGestureRecognizer)

3 个答案:

答案 0 :(得分:2)

最后,找出了崩溃的原因。

您点击的功能:

func iconTapped(gestureRecognizer: UITapGestureRecognizer, _ sender: AnyObject) {
    print("tapped")
}

应该是这样的:

func iconTapped(gesture: UITapGestureRecognizer) {
    // To get the sender's tag, do this:
    print(gesture.view.tag)
}

同时将#selector调整到正确的功能。

当将选择器设置为UITapGestureRecognizer时,识别器对象将仅使用发送者调用选择器,并且不能向该函数添加另一个参数。

因此,崩溃的根本原因是因为您尝试使用一个参数(这是手势发出的参数)将方法拟合到具有两个参数的方法中。这次崩溃非常有趣,因为它在模拟器上运行正常,但只在实际设备中崩溃。我想这是因为模拟器和设备处理功能与额外的参数不同? (模拟器忽略它与设备崩溃)。如果你发现了为什么会发生这种情况的更深层次,我很想知道。

答案 1 :(得分:0)

最可能你的CurrentSixFriendsList没有gestureRecognizer.view?.tag)的价值!但是在这一行之前有一个断点

tappedIcon = CurrentSixFriendsList[(gestureRecognizer.view?.tag)!]

即便如此,如果您没有收到错误,请安装crashlytics。这是一个可以告诉您崩溃问题的工具。

答案 2 :(得分:0)

替换您的点击手势代码&从swift 3.x开始,您需要使用#selector

let tapGesture = UITapGestureRecognizer.init(target: self, action: #selector(dismissKeyboard))
self.view.addGestureRecognizer(tapGesture)


@objc func dismissKeyboard(gesture: UITapGestureRecognizer) {
    view.endEditing(true)
}