虽然它是在init中设置的,但对象是nil

时间:2017-04-22 18:37:50

标签: swift

我有一个名为navigator的对象,我在init中设置了它。我打破它以确保它已设置。然而,当一个IBAction函数,linkBut​​tonClicked,被调用并尝试使用导航器时,我得到一个零异常。为什么呢?

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)
    }
}

1 个答案:

答案 0 :(得分:1)

当您从某种编码存储(如Core Data)检索对象时,将使用init?(coder: NSCoder)初始值设定项。 NSCoding协议需要此初始化程序,并且仅使用 对对象进行反序列化。因此,在创建对象时不会被调用。只有在使用NSCoding序列化对象并稍后对其进行反序列化时才会调用它。

为了确保在视图中设置某些值,您要覆盖的功能是init(如果您确实想使用其init ,重载的方法是init(frame:))。相反,您应该在视图控制器的viewDidLoad方法中设置要使用的任何变量。