2012-10-11 31 views
0

我有一種情況,我加載Facebook的飼料,並根據職位類型(視頻/圖像/鏈接等),我創建相應的類。每個帖子類型都有不同的對應模型類和視圖類,但是每個帖子只有一個實例化的控制器類。 現在我需要一種動態決定在控制器內爲特定的帖子類型創建哪個模型和視圖類的方法。現在,我有一個創建輔助類,它根據帖子類型返回相應的模型和視圖類。但這似乎是一種凌亂的做事方式。如果有20個帖子類型,那20個東西如果語句。正確的方式來動態決定創建哪個類

有沒有更好的方法來做到這一點?

回答

1

你可以保持一個地圖職位類型對類名用於處理類型的(各種):

static struct 
{ 
    PostType type;   // A typedef'd enum with POST_TYPE_ONE, ... 
    NSString *classname; 
} _handlers[] = 
{ 
    { POST_TYPE_ONE, @"OneHandler" }, 
    { POST_TYPE_TWO, @"TwoHandler" }, 
    .... 
    { POST_TYPE_TWENTY, @"TwentyHandler" } 
}; 

const NSUInteger NUM_HANDLERS = sizeof(_handlers)/sizeof(_handlers[0]); 

,然後用實例化類的實例:

id handler = nil; 
for (NSUInteger index = 0; index < NUM_HANDLERS && handler == nil; index++) 
{ 
    if (postType == _handlers[index].postType) 
    { 
     handler = [[ NSClassFromString(_handlers[index].classname) alloc ] init]; 
    } 
} 

或者如果您可以保證postType將始終在0到19之間,則可以保留一組類名並使用:

id handler = [[ NSClassFromString(_handlers[postType] alloc ] init]; 

您應確保所有處理程序類都來自公共基類,以提供通用功能。

+0

是的,這與我想到的方法類似。只是想知道是否有更好的方式,我錯過了。謝謝 –

+0

@KhalidBajwa除了你有20件事'if'陳述,現在你不... – trojanfoe

+0

嗯,我的意思是,我發佈了這個問題後,我想出了一個類似的方法,但我讓問題萬一有人想出了更好的想法。你的答案肯定有幫助。謝謝 :) –

1

有一個plist文件將帖子類型映射到類名稱。把它讀入字典。使用帖子類型作爲鍵在字典中查找類名。然後使用NSClassFromString()創建實際的班級。

+0

好主意,但我想在代碼中做到這一點,以避免錯誤地命名類的風險。 –