2012-07-30 46 views
0

我正在創建UIView的自定義子類。我目前正在基於Objective C - Custom view and implementing init method?進行初始化,因此無論是從代碼加載還是從xib加載,都會進行一些初始化。如何通過xib指定自定義視圖初始化所需的屬性?

現在的問題是,我添加了一個'必需'的屬性(爲了討論的緣故,我們稱之爲reqProp) - 如果沒有設置此屬性,視圖將無法呈現,並且必須在任何可以使用特定於我的視圖子類的其他功能。由於這個原因,我認爲執行這個要求的自然地點是提供一個新的init函數,所以我不必擔心它不會被設置在我的代碼的其餘部分 - 例如

initWithFrame:(CGRect)frame forReqProp:(NSString *)reqProp; 

但是,我不確定如何通過initWithCoder初始化時執行相同的要求。

我能想到的最接近的情況是需要在用戶定義的運行時屬性中指定此屬性(在需要在界面生成器中定義自定義類名稱的地方),但在這種情況下,它不清楚何時/如果由於沒有指定財產,我應該「炸燬」。

我能想到的唯一的其他選項是非常明確的文檔,這個必需屬性必須是在使用視圖之前設置的第一件事。

+0

只有合理的默認纔會浮現在腦海。 – Eimantas 2012-07-30 22:39:24

+0

我不能爲這個特定的屬性默認任何東西 - 它必須由開發人員使用這個視圖指定。換句話說 - 我挑選的任何默認值都是錯誤的,使用視圖的開發人員在使用視圖之前需要對其進行更改。 – Krease 2012-07-30 23:48:00

回答

0

如果問題可以通過要求它是在使用視圖之前設置的第一個屬性來解決,那麼它不是真正的需要進行初始化。這裏的建議是很好的文檔。

然而,潛在的問題可能通過一些重構得到更好的解決,所以它不需要成爲第一個屬性集。在這種情況下,一個非常基本的重構可能涉及存儲其他屬性的字典,並且只有在設置了必需的屬性後才真正地設置它們(並且對渲染有影響)。

例如:

- (void) setOptionalProperty1:(id)prop 
{ 
    [propMap setObject:prop forKey:@"property1"]; 
    if (self.requiredProperty) { 
     _optionalProperty1 = prop; 
    } 
} 

- (void) setOptionalProperty2:(id)prop 
{ 
    [propMap setObject:prop forKey:@"property2"]; 
    if (self.requiredProperty) { 
     _optionalProperty2 = prop; 
    } 
} 

- (void) setRequiredProperty:(id)requiredProp 
{ 
    _requiredProperty = requiredProp; 
    // now iterate over propMap and set those properties properly 
} 

它不一定是最好的重構,而是一個普通的簡單的例子,應該把工作做好,並保持基本的限制(需要屬性必須設置在前)完好無強制這一要求對使用該類的開發人員。

0

我現在不在我的支持XCode的計算機上,所以我無法測試此操作,但是如何從initWithCoder方法呈現表格,這需要用戶在方法完成之前輸入reqProp的值。

+0

你的意思是在initWithCoder期間提示用戶輸入嗎?這似乎是非常錯誤的... – Krease 2012-08-01 16:49:31

+0

是的,經過更多的思考後,我認爲你是對的,這可能是一個壞主意。你能做到這一點嗎?或者在這個過程中爲時已晚?這似乎是這樣做的地方,而不是在init方法中。 – rdelmar 2012-08-01 20:39:56