所以我设置了一个正常工作的UITextField,但是当试图将控件标准化以便可以在其他视图中重用时,我似乎无法初始化它/让它以相同的方式工作它作为一个简单的UITextField。
变量声明为
@IBOutlet weak var searchTextField: SearchTextField!
然后初始化并设置委托:
self.searchTextField = SearchTextField()
self.searchTextField.delegate = self
但是在尝试设置委托时我得到了EXC_BAD_INSTRUCTION。我已经取出并向子类中添加了各种init方法,我当前的版本有3个可能有点过分,但它们会阻止编译器抱怨:
import Foundation
class SearchTextField : UITextField
{
override init()
{
super.init()
}
override init(frame:CGRect)
{
super.init(frame:frame)
}
required init(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
func setPlaceholderText()
{
let searchIconCharacter: Character = "\u{1F50D}"
let searchFieldPlaceholder: String = "\(searchIconCharacter) Where to?"
self.placeholder = searchFieldPlaceholder
}
}
我确信我的快速语法很糟糕,所以我应该纠正的任何事情让我知道。有什么东西导致SearchTextField没有被设置,它在初始化后仍然是零?它与弱IBOutlet有关吗?
答案 0 :(得分:3)
由于您是在代码而不是界面构建器中初始化它,因此请从以下位置更改声明:
@IBOutlet weak var searchTextField: SearchTextField!
到
var searchTextField = SearchTextField()
这将阻止您的视图被取消分配。
答案 1 :(得分:1)
尝试更改
required init(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
到
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
答案 2 :(得分:1)
虽然我的可怕代码存在多个问题,但最终的解决方案是在故事板中将UITextField更改为SearchTextField。当然,Aaron也错了,我错误地覆盖了故事板创建的实例。