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.

的调用

库中似乎有错误,你能在这里检查一下吗

SearchTextField Issue

它在他们的存储库中仍然存在未解决的问题。

如果您尝试使用某人现成的代码,请注意存储库中的问题。

单击文本字段然后添加 class name = SearchTextField.swift 对我有用。