iOS Swift EXC_BAD_ACCESS 代码 2 SearchTextField(UITextField 子类)
iOS Swift EXC_BAD_ACCESS code 2 SearchTextField (UITextField subclass)
我对使用 Swift 进行 iOS 开发比较陌生(我实际上有 3 年使用 Java 进行 Android 开发的经验,正在努力学习新技术).我正在创建一个需要使用名为 SearchTextField 的库的应用程序:
https://github.com/apasccon/SearchTextField
简而言之,它是一个具有下拉 suggestions/autocomplete 功能的 UITextField 子类。
下面是使用它的ViewController...
@IBOutlet var homeAddressTextField: SearchTextField!
@IBOutlet var workAddressTextField: SearchTextField!
override func viewDidLoad() {
super.viewDidLoad()
homeAddressTextField.delegate = self
workAddressTextField.delegate = self
homeAddressTextField.addTarget(self, action: #selector(textFieldDidChange(_:)), for: .editingChanged)
workAddressTextField.addTarget(self, action: #selector(textFieldDidChange(_:)), for: .editingChanged)
//vvvvvvvvv EXC_BAD_ACCESS CODE 2 THROWN BELOW vvvvvvvv
homeAddressTextField.filterStrings(["foo","bar"])
}
homeAddressTextField
应该被实例化,否则上面对它的任何引用都应该抛出相同的异常。当断点到有问题的行时,homeAddressTextField 是 NOT nil,并正确显示它是 SearchTextField 的一个实例。
我已经尝试了很多方法来修复或至少找到错误的根源。如您所知,我为 Outlet 使用了强变量而不是弱变量。
我曾尝试使用 zombies 来跟踪任何访问已释放内存块的尝试,但 zombie Instruments 没有发现任何僵尸被访问。
如果值得注意,只要删除包含 filterStrings() 的有问题的行,错误就会消失。感谢您的帮助!
您确定已在界面生成器中附加 IBOutlet 吗?
尝试在崩溃的行上放置一个断点。这将在执行该行之前立即停止它。然后,在控制台 (command+shift+y) 中,您会看到一行显示 "lldb" - 将光标放在那里并键入 po homeAddressTextField
并查看它是否 returns 一个值,或者零。如果为nil,则说明IBOutlet没有设置好,会导致访问失败。
此外,如果 确实为零,您需要确保子类和模块都在 SearchTextField 的界面构建器中设置,并确保设置插座本身。您也可以尝试在 viewDidAppear() 方法中过滤这些字符串,看看它是否确实是对 SearchTextField 的引用的问题。
编辑:我浏览了一些代码库的代码。您可能不想设置数据源和委托属性,因为 SearchTextField 有自己的数据源和委托。您只需要像在最后一行一样设置可过滤的字符串。因此,请尝试删除使视图控制器成为 datasource/delegate.
的调用
库中似乎有错误,你能在这里检查一下吗
它在他们的存储库中仍然存在未解决的问题。
如果您尝试使用某人现成的代码,请注意存储库中的问题。
单击文本字段然后添加 class name = SearchTextField.swift 对我有用。
我对使用 Swift 进行 iOS 开发比较陌生(我实际上有 3 年使用 Java 进行 Android 开发的经验,正在努力学习新技术).我正在创建一个需要使用名为 SearchTextField 的库的应用程序:
https://github.com/apasccon/SearchTextField
简而言之,它是一个具有下拉 suggestions/autocomplete 功能的 UITextField 子类。
下面是使用它的ViewController...
@IBOutlet var homeAddressTextField: SearchTextField!
@IBOutlet var workAddressTextField: SearchTextField!
override func viewDidLoad() {
super.viewDidLoad()
homeAddressTextField.delegate = self
workAddressTextField.delegate = self
homeAddressTextField.addTarget(self, action: #selector(textFieldDidChange(_:)), for: .editingChanged)
workAddressTextField.addTarget(self, action: #selector(textFieldDidChange(_:)), for: .editingChanged)
//vvvvvvvvv EXC_BAD_ACCESS CODE 2 THROWN BELOW vvvvvvvv
homeAddressTextField.filterStrings(["foo","bar"])
}
homeAddressTextField
应该被实例化,否则上面对它的任何引用都应该抛出相同的异常。当断点到有问题的行时,homeAddressTextField 是 NOT nil,并正确显示它是 SearchTextField 的一个实例。
我已经尝试了很多方法来修复或至少找到错误的根源。如您所知,我为 Outlet 使用了强变量而不是弱变量。
我曾尝试使用 zombies 来跟踪任何访问已释放内存块的尝试,但 zombie Instruments 没有发现任何僵尸被访问。
如果值得注意,只要删除包含 filterStrings() 的有问题的行,错误就会消失。感谢您的帮助!
您确定已在界面生成器中附加 IBOutlet 吗?
尝试在崩溃的行上放置一个断点。这将在执行该行之前立即停止它。然后,在控制台 (command+shift+y) 中,您会看到一行显示 "lldb" - 将光标放在那里并键入 po homeAddressTextField
并查看它是否 returns 一个值,或者零。如果为nil,则说明IBOutlet没有设置好,会导致访问失败。
此外,如果 确实为零,您需要确保子类和模块都在 SearchTextField 的界面构建器中设置,并确保设置插座本身。您也可以尝试在 viewDidAppear() 方法中过滤这些字符串,看看它是否确实是对 SearchTextField 的引用的问题。
编辑:我浏览了一些代码库的代码。您可能不想设置数据源和委托属性,因为 SearchTextField 有自己的数据源和委托。您只需要像在最后一行一样设置可过滤的字符串。因此,请尝试删除使视图控制器成为 datasource/delegate.
的调用库中似乎有错误,你能在这里检查一下吗
它在他们的存储库中仍然存在未解决的问题。
如果您尝试使用某人现成的代码,请注意存储库中的问题。
单击文本字段然后添加 class name = SearchTextField.swift 对我有用。