许多子类的一个 XIB 视图

Posted

技术标签:

【中文标题】许多子类的一个 XIB 视图【英文标题】:One XIB View For Many Subclasses 【发布时间】:2015-02-09 19:24:25 【问题描述】:

我有一个带有一个视图的 xib 文件,连接到一个名为 InputView 的 UIView。我有一些InputView 的子类,例如NameInputDateInput。我正在使用 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 视图的主要内容,如果未能解决你的问题,请参考以下文章

子类化视图控制器

从 XIB 加载自定义视图,如何使其响应自定义子类?

如何正确子类化从 Swift 中的 xib 加载的视图类?

2个视图控制器,每个都有自己的xib,其中一个是另一个的子类?

我可以使用 UIView(.xib 和类)作为许多视图的视图基础示例吗?

XIB 中的 UIView 子类不显示(drawRect:从未调用)