我正在尝试创建一个屏幕,其中包含一行自定义按钮(以及其他内容)。为了便于重用,我有一个自定义类(xib和swift文件)用于按钮(MyButton:UIView)和按钮行(MyRowController:UIViewController)。在MyRowController.xib中,我有一排按钮,它们有" Custom Class"属性设置为MyButton。我正在尝试将MyRowController的一个实例添加到屏幕(MyViewController:UIViewController),如下所示:
let nib = UINib(nibName: "MyRowController", bundle: NSBundle.mainBundle())
let row = nib.instantiateWithOwner(self, options: nil)[0] as MyRowController
self.view.addSubview(row.view)
不幸的是,这会导致MyButton的awakeFromNib方法崩溃: "致命错误:在展开可选值"
时意外发现nil @IBOutlet weak var grayBackgroundView: UIView!
override func awakeFromNib() {
super.awakeFromNib()
grayBackgroundView.backgroundColor = UIColor.whiteColor()
}
显然,当调用awakeFromNib时,尚未实例化grayBackgroundView(如果我注释掉grayBackgroundView行,则没有崩溃,但我的MyButton视图中没有显示任何标签或图像)。当我尝试将MyButton直接添加到MyViewController(删除MyRowController作为中间人)时,一切正常 - 没有崩溃,所有标签/图像都正常显示。
我也试过让MyRowController成为UIView的子类,同样的事情发生了。
我是iOS新手,所以如果这是重复使用视图的非标准/可怕方式,请告诉我们。我不确定我是否应该在MyRowController的初始化程序中做一些事情来帮助实例化MyButtons(目前除了调用super.init(编码器:aDecoder)之外什么都没做)?
非常感谢任何指导!