许多子类的一个XIB视图

时间:2015-02-09 19:24:25

标签: swift uiview subclass xib

我有一个xib文件,其中包含一个视图,连接到名为InputView的UIView。我有一些InputView的子类,例如NameInputDateInput。我正在使用swift,我想使用连接到NameInput的xib文件中的视图来实例化InputView对象。我不想在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
}

2 个答案:

答案 0 :(得分:1)

如果我正确地阅读了您的问题并且您正在从nib文件中加载InputView,那么答案是您无法做到的。从nib文件加载的所有对象的类在nib文件中是静态的。

那就是说,你不能完全确定。由于nib文件是通过NSKeyedUnarchiver加载的,因此您可以做一些关于将子类注册为InputView的加载器并以这种方式处理它的方法,但它会非常难看,错综复杂,难以辨认。

最好只创建多个与视图类不同的nib文件。

答案 1 :(得分:0)

我的建议是使用其他机制自定义功能。

例如,您可以在视图控制器中自定义功能。 MVC设计模式通常涉及在控制器中而不是在视图中定制行为。因此,在控制器中,您可以根据加载的数据自定义功能。您可以通过多种方式执行此操作,包括使用由控制器动态创建的自定义上下文类,或者向控制器提供块以进行自定义。

您还可以通过将块传递到基于某些上下文执行不同操作的视图来自定义功能。如果您需要自定义视图行为,例如自动布局约束等,我会这样做。

相关问题