我对使用Swift的iOS开发相对较新(我实际上有3年的Java开发经验,尝试学习新技术)。我正在创建一个需要使用名为SearchTextField的库的应用程序:
https://github.com/apasccon/SearchTextField
在一个shellnut中,它是一个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使用了强var而不是弱var。
我尝试使用 zombies 来跟踪任何访问已解除分配的内存块的尝试,但zombie Instruments却没有访问僵尸。
如果值得注意,只要删除包含filterStrings()的有问题的行,错误就会消失。任何帮助表示赞赏!
答案 0 :(得分:2)
答案 1 :(得分:0)
您确定已将IBOutlet附加到界面构建器中吗?
尝试在崩溃的行上放置一个断点。这将在执行该行之前立即停止。然后,在控制台(命令+ shift + y)中,您将看到一行显示“lldb” - 将光标放在那里并键入po homeAddressTextField
并查看它是否返回值,或者为零。如果为nil,那么IBOutlet设置不正确,这将导致访问不良。
此外,如果 确实为零,那么您需要确保在SearchTextField的接口构建器中设置子类和模块,并确保设置插座本身。您还可以尝试在viewDidAppear()方法中过滤这些字符串,以查看它是否确实是对SearchTextField的引用的问题。
编辑:我已经查看了一些回购代码。您可能不希望设置数据源和委托属性,因为SearchTextField具有自己的数据源和委托。您只需要在最后一行设置可过滤字符串。因此,请尝试删除调用以使视图控制器成为数据源/委托。
答案 2 :(得分:0)