2015-02-09 83 views
2

我有一个xib文件,其中包含一个视图,连接到名为InputView的UIView。我有InputView的几个子类,例如NameInputDateInput。我使用的是swift,我想使用连接到InputView的xib文件中的视图实例化NameInput对象。我不想在xib文件中创建更多视图,因为InputView的每个子类都是相同的。从本质上讲,我问我如何使用一个xib文件与一个视图与该视图的许多子类。一个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 
} 
+0

出于好奇,这样做的目的是什么?通常,视图与支持视图的类强相关。你想用子类来实现什么? – tng 2015-02-09 19:45:19

+0

子类都具有相同的视图,但具有不同的功能。 – jamespick 2015-02-09 21:07:22

回答

1

如果我正确地读你的问题,你从笔尖文件加载您InputView,答案是不能。从nib文件加载的所有对象的类在nib文件中都是静态的。

也就是说,这不是严格的,你不能。由于nib文件是通过NSKeyedUnarchiver加载的,因此您可能可以做一些有关将子类注册为InputView的加载程序并进行处理的操作,但这会非常丑陋,令人费解且难以辨认。

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

+0

好的。我想这个现在必须做。谢谢 – jamespick 2015-02-09 21:07:40

0

我的建议是使用另一种机制来定制功能。

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

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