我有一个名为navigator的对象,我在init中设置了它。我打破它以确保它已设置。然而,当一个IBAction函数,linkButtonClicked,被调用并尝试使用导航器时,我得到一个零异常。为什么呢?
class HomeCollectionViewCell: UICollectionViewCell {
let appDelegate:AppDelegate!
let navigator: Navigator!
@IBOutlet weak var linkButton: UIButton!
var destinationView:String?
var parentViewController:UIViewController?
@IBAction func linkButtonClicked(_ sender: Any) {
do {
try self.navigator.navigate(to: self.destinationView!, from: parentViewController!)
} catch {
}
}
required init?(coder aDecoder: NSCoder) {
self.appDelegate = UIApplication.shared.delegate as! AppDelegate
self.navigator = self.appDelegate.navigator
super.init(coder: aDecoder)
}
override func prepareForReuse() {
super.prepareForReuse()
// do resetting here if needed, like empty out data
linkButton.setTitle(nil, for: .normal)
}
}
答案 0 :(得分:1)
当您从某种编码存储(如Core Data)检索对象时,将使用init?(coder: NSCoder)
初始值设定项。 NSCoding
协议需要此初始化程序,并且仅使用 对对象进行反序列化。因此,在创建对象时不会被调用。只有在使用NSCoding
序列化对象并稍后对其进行反序列化时才会调用它。
为了确保在视图中设置某些值,您要覆盖的功能是不其init
(如果您确实想使用其init
,重载的方法是init(frame:)
)。相反,您应该在视图控制器的viewDidLoad
方法中设置要使用的任何变量。