【发布时间】:2015-12-18 17:49:40
【问题描述】:
我创建了一个自定义视图 (ImageAndToolBarContainerView),其中包含我想加载到我的应用程序中的多个 UIViewController 中的相应 XIB 文件。
我一直在寻找有关如何执行此操作的适当教程,但我遇到的几乎每一个都太旧或导致重大异常。
当我尝试通过故事板/NIB 加载它时,(我在故事板上的 UIViewController 中创建了一个视图,并将“Class”属性设置为 ImageAndToolBarContainerView。我设置了出口,包括视图,但在调用类时它们似乎都没有加载,我收到错误:
致命错误:在展开可选值时意外发现 nil
当我尝试访问视图时:
required init?(coder aDecoder: NSCoder)
{
super.init(coder: aDecoder)
//setup()
self.view.frame = self.bounds
self.addSubview(view)
}
然后,我尝试使用以下代码来加载 NIB(通过取消注释上面的 setup() 函数。设置代码是这样的:
func setup()
{
self.loadViewFromNIB()
self.view.frame = self.bounds
self.addSubview(view)
}
func loadViewFromNIB() -> UIView
{
let bundle = NSBundle(forClass: self.dynamicType)
let nib = UINib(nibName: "ImageAndToolBarContainer", bundle: bundle)
let view = nib.instantiateWithOwner(self, options: nil)[0] as! UIView
return view
}
这当然会导致无限循环。
我还声明了以下函数:
override func awakeFromNib()
{
super.awakeFromNib()
self.view.frame = self.bounds
self.addSubview(view)
}
我在这里缺少什么?我哪里做错了?是否有关于如何正确执行此操作的权威教程?
【问题讨论】:
-
纯 FWIW。这些天你真的应该只使用容器视图。它有点像 iOS 编程的“房间里的大象”。 everything 现在应该只是一个容器视图。这非常容易。苹果这样做正是为了消除你提到的所有问题。长教程stackoverflow.com/a/23403979/294884
-
您的自定义视图的 .nib 的文件所有者是谁?你是如何创建你的视图控制器的?它们是来自 Storyboard 还是另一个 .nib?
-
好像您在
View的Class字段中设置ImageAndToolBarContainerView,而不是在File's Owner中设置它。 -
谢谢你,乔,我会复习的。在文件所有权方面,nib 的所有者是 ImageAndToolBarContainerView 类。视图控制器是在情节提要中创建的。 ImageAndToolBarContainerView 也设置在 File Owner 中,而不是在 View 的类中
-
你查到这件事的底部了吗?我似乎遇到了类似的问题!
标签: swift ios9 xcode7 nib custom-view