我使用图像视图来显示用户的好友列表。用户应该能够点击一个朋友的图标,并被带到另一个屏幕。我编写的代码在Xcode模拟器上工作得很好。然而,当我在设备上运行时,每次我点击一个图标,应用程序就会崩溃。
我真的不知道从哪里开始调试这个,即使经过了大量的google-ing。如有任何建议/帮助,我们将不胜感激。
我读到过,我的特定错误可能与内存分配有关(?)但仍然不知道从哪里开始/做些什么。当我检查我的设备日志时,异常类型显示如下:异常类型: 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)发布于 2017-09-15 22:33:56
最后,找出了它崩溃的原因。
您的已开发的功能:
func iconTapped(gestureRecognizer: UITapGestureRecognizer, _ sender: AnyObject) {
print("tapped")
}应该是这样的:
func iconTapped(gesture: UITapGestureRecognizer) {
// To get the sender's tag, do this:
print(gesture.view.tag)
}还可以将#选择器调整为正确的函数。
当将选择器设置为UITapGestureRecognizer时,识别器对象将调用只有发送方的选择器,并且不能向该函数添加另一个参数。
因此,造成崩溃的根本原因是,您试图将一个带有一个参数的方法(手势所发送的参数)放入一个带有两个参数的方法中。这次坠机非常有趣,因为它在模拟器上正常工作,但只在一个实际的设备中坠毁。我想是因为模拟器和设备处理额外参数的功能不同吗?(模拟器忽略它与设备崩溃)。如果你能更深入地了解为什么会发生这种情况,我很想知道。
发布于 2017-09-15 03:26:56
最有可能的是,您的CurrentSixFriendsList没有gestureRecognizer.view?.tag的值)!.But是该行前面的断点
tappedIcon = CurrentSixFriendsList[(gestureRecognizer.view?.tag)!]即使这样,如果您没有得到一个错误,那么安装crashlytics.This是一个工具,将告诉您的崩溃问题。
发布于 2017-11-23 17:36:05
替换您的点击手势代码&从快速3.x开始,您需要使用#选择器
let tapGesture = UITapGestureRecognizer.init(target: self, action: #selector(dismissKeyboard))
self.view.addGestureRecognizer(tapGesture)
@objc func dismissKeyboard(gesture: UITapGestureRecognizer) {
view.endEditing(true)
}https://stackoverflow.com/questions/46231122
复制相似问题