【问题标题】:UITapGestureRecognizer Crashes App..?UITapGestureRecognizer 崩溃应用程序..?
【发布时间】:2017-09-15 03:13:42
【问题描述】:

我正在使用图像视图来显示用户的朋友列表。用户应该能够点击朋友的图标并被带到另一个屏幕。我编写的代码在 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")

}

第二次更新: 所以我注释掉了所有用于渲染图像视图的代码,并硬编码了一个图像视图。 (只有一个图像视图)带有我项目中的静态图像。即使我点击此 imageView,图像视图也会显示并且应用程序崩溃。为什么表现得这么奇怪!?我要疯了... 我在 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)

【问题讨论】:

  • 尽量避开!,开心点……
  • 我在更新时避免了它,但我仍然很不高兴.. :(
  • 当您说您有图像列表时,是否涉及 tableview / collectionview?还是您只是使用 Tapgesturerecognizers 在循环中创建图像并将它们以静态方式放置在某个地方?
  • @aksh1t 没有集合视图或表格视图。只是一个循环,它创建 x 数量的图像视图并将它们作为带有图像的图标添加到屏幕上。我已将 userEnabled 设置为 true,以便可以点击它们。我限制了屏幕上允许的图标数量 - 以静态方式,是的
  • 奇怪的是您的代码确实在模拟器上运行,但不在实际设备中。我唯一能想到的就是要求您仔细检查 UIImage 名称字符串(模拟器不区分大小写,设备是)。此外,如果您在适当的设备中使用它们,请仔细检查您是否拥有视网膜和 3 倍图像。

标签: swift swift3 uiimageview uigesturerecognizer uitapgesturerecognizer


【解决方案1】:

终于找到了崩溃的原因。

您点击的功能:

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 时,识别器对象将仅使用发送者调用选择器,并且您不能向该函数添加其他参数。

因此,崩溃的根本原因是因为您试图将具有一个参数的方法(即手势发出的内容)拟合到具有两个参数的方法中。这次崩溃非常有趣,因为它在模拟器上运行良好,但只在实际设备中崩溃。我猜是因为模拟器和设备处理带有额外参数的函数不同? (模拟器忽略它与设备崩溃)。如果您发现更深层次的原因,这究竟是为什么会发生,我很想知道。

【讨论】:

  • 成功了!奇怪的是,今天早上我在查看参数时认为它们不匹配很奇怪......但是当我搜索堆栈时,其他人一直在使用这些确切的参数并且没有抱怨崩溃。谢谢!
  • 你刚刚救了我的命。
【解决方案2】:

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

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

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

【讨论】:

  • 所以我添加了以下打印语句并添加了建议的断点。崩溃时点击的图标不为空。 print("TAPPED FRIEND INFO: (CurrentSixFriendsList[(gestureRecognizer.view?.tag)!])")
  • 在nextVC中注释掉viewController生命周期函数中的所有代码,然后运行....
  • 所以我把nextVC上的所有功能都注释掉了,我也把点击图标功能下的所有东西都注释掉了。 iconTapped 函数现在唯一做的是 print("tapped") 并且它仍然在点击时崩溃......它必须是图像视图或手势识别器的东西,对吧?
【解决方案3】:

替换你的点击手势代码 & 从 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)
}

【讨论】:

    猜你喜欢
    • 2017-08-04
    • 1970-01-01
    • 2011-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-03
    • 2011-01-01
    相关资源
    最近更新 更多