许多子类的一个 XIB 视图
Posted
技术标签:
【中文标题】许多子类的一个 XIB 视图【英文标题】:One XIB View For Many Subclasses 【发布时间】:2015-02-09 19:24:25 【问题描述】:我有一个带有一个视图的 xib 文件,连接到一个名为 InputView
的 UIView。我有一些InputView
的子类,例如NameInput
和DateInput
。我正在使用 swift,我想使用连接到 InputView
的 xib 文件中的视图来实例化 NameInput
对象。我不想在 xib 文件中创建更多视图,因为InputView
的每个子类看起来都一样。本质上,我问的是如何将一个 xib 文件与一个视图与该视图的许多子类一起使用。
这应该返回一个DateInput
对象。
class func make(label: String, placeholder: String, format: String) -> DateInput
let input = InputView.make() as DateInput
input.label.text = label
input.valueField.placeholder = placeholder
input.format = format
input.valueField.inputView = KeyboardView(subview: input.datePicker, appearance: .Dark)
input.datePicker.addTarget(input, action: "setDate", forControlEvents: .ValueChanged)
return input
这应该返回一个普通的InputView
对象。
class func make() -> InputView
let view = NSBundle.mainBundle().loadNibNamed("InputView", owner: nil, options: nil)[0] as InputView
view.valueField.delegate = view
return view
【问题讨论】:
出于好奇,这样做的目的是什么?通常,视图与支持该视图的类密切相关。你想用子类实现什么? 子类的视图相同,但功能不同。 【参考方案1】:如果我正确阅读了您的问题并且您正在从 nib 文件加载您的 InputView
,那么答案是您不能。从 nib 文件加载的所有对象的类在 nib 文件中是静态的。
也就是说,严格来说你不能这样做。由于 nib 文件是通过 NSKeyedUnarchiver
加载的,您也许可以将您的子类注册为 InputView
的加载器并以这种方式处理它,但它会非常丑陋、复杂且难以辨认。
最好只创建多个除了视图类之外相同的 nib 文件。
【讨论】:
好的。我想现在必须这样做。谢谢【参考方案2】:我的建议是使用另一种机制自定义功能。
例如,您可以在视图控制器中自定义功能。 MVC 设计模式通常涉及在控制器中而不是在视图中自定义行为。因此,在控制器中,您可以根据加载的数据自定义功能。您可以通过多种方式做到这一点,包括由控制器动态创建的自定义上下文类,或向控制器提供块以进行自定义。
您还可以通过将块传递给基于某些上下文执行不同操作的视图来自定义功能。如果您需要自定义视图行为,例如自动布局约束等,我会这样做。
【讨论】:
以上是关于许多子类的一个 XIB 视图的主要内容,如果未能解决你的问题,请参考以下文章
2个视图控制器,每个都有自己的xib,其中一个是另一个的子类?