【发布时间】:2018-03-25 17:39:28
【问题描述】:
到目前为止,我发现的所有资源都建议使用此代码的变体从xib 文件加载视图,但始终实现相同的逻辑:
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
var view = (Bundle.main.loadNibNamed("MyCustomView", owner: self, options: nil)![0])
self.addSubview(view as! UIView)
}
这对我来说看起来不正确,因为该函数属于 UIView 的子类,并将预期设计(xib 的设计)添加为子视图。在这种情况下,如果我们向self 添加了不同的 UI 元素,那么它与xib 文件中的 UI 元素属于不同的父元素。
所以层次结构看起来像这样:
---self (UIView)
---Other UI elements added by code in `self`
---xib (UIView)
---UI elements in xib file
这不是不必要的包装吗?如果是这样,有没有办法将xib文件中的所有视图直接添加到self?还是有其他更优雅的方式从xib 文件加载设计?
【问题讨论】:
-
我觉得奇怪的是,你找到的“所有资源”都是这样。有两件事让我觉得不寻常:首先,笔尖是从
init(NSCoder)构造函数中加载的。此构造函数通常在从 nib(或故事板)加载时使用;换句话说,从另一个 nib 加载时加载辅助 nib 很奇怪——一个 nib 通常包含 整个 视图层次结构。其次,owner通常是一个视图控制器,而不是另一个视图。 -
@JamesBucanek 是的,这实际上很奇怪。我发现可以将
self分配给从objective-c的笔尖加载的view,这就是人们过去这样做的方式。对于您强调的第二点,这是真的,但我的目的是创建一个可重用的视图,我可以将其添加到 inside 其他视图中。当您从viewcontroller加载笔尖时,您无法将该视图添加到另一个视图中,它有自己的屏幕。我不明白这是一个如何被忽视的问题:整个viewcontroller实践基于 MVC 模型,但同时创建可重用对象很乏味 -
这不是真的。您可以拥有任意数量的视图控制器,只要您喜欢/需要。视图控制器可用于管理视图中的任意视图子集,并且非常适合在不同的视图层次结构中重用 MVC 模式。我会用答案来说明...
标签: ios swift xcode uiview uikit