2015-02-09 87 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設計模式通常涉及在控制器中定製行爲,而不是在視圖中。因此,在控制器中,您可以根據加載的數據自定義您的功能。您可以通過多種方式來完成此操作,包括具有由控制器動態創建的自定義上下文類,或將控制塊提供給控制器以進行自定義。

您還可以通過將塊傳遞給基於某些上下文執行不同操作的視圖來自定義功能。如果您需要自定義視圖行爲(如自動佈局約束等),我會這樣做。