作者热门文章
- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我有一个名为 navigator 的对象,我在 init 中设置了它。我打开它以确保它已设置好。但是,当 IBAction 函数 linkButtonClicked 被调用并尝试使用导航器时,我得到一个 nil 异常。为什么?
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)
}
}
最佳答案
init?(coder: NSCoder)
初始化器在您从某种编码存储(例如 Core Data)中检索对象时使用。此初始化程序是 NSCoding
协议(protocol)所必需的,并且仅用于反序列化对象。因此,它不会在对象创建时被调用。只有当您使用 NSCoding
序列化对象并稍后反序列化它时,它才会被调用。
为了确保在您的 View 中设置某些值,您想要覆盖的函数不是它的init
(如果您真的想使用它的init
,重载的方法是init(frame:)
)。相反,您应该在 View Controller 的 viewDidLoad
方法中设置任何您希望可用的变量。
关于swift - 对象是 nil,尽管它是在 init 中设置的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43563131/
我是一名优秀的程序员,十分优秀!