2010-04-16 67 views
1

我在我的應用程序中使用Three20TTMessageController。我已經想出瞭如何使用它,添加了一堆其他東西(包括TTMessageControllerDelegate方法和ABPeoplePickerNavigationControllerDelegate方法)。經過一番努力才發現,它對我很好。如何在兩個控制器中使用一個modalViewController?

我現在遇到的麻煩是設計問題:我想在兩個不同的地方使用它,包括使用相同的委託方法。我目前的做法是,我已經把所有的代碼放到一個類從NSObject繼承,叫ComposerProxy,我只是隨便使用它使用代理,像這樣兩個控制器:

ComposerProxy *proxy = [[ComposerProxy alloc] initWithController:this]; 
[proxy go]; 

go方法構造TTMessageController,配置它,將它添加到一個UINavigationController,並提出它:

[self.controller presentModalViewController: navController animated: YES]; 

這個偉大的工程,因爲我有我所有的代碼很好地封裝在ComposerProxy,我只需要上述兩行的任何地方我想要使用它。

然而,不利的一面是,我不能dealloc變量proxy沒有崩潰。我不能autorelease它,要麼:同樣的問題。

所以我想知道我的代理方法是否可憐。一個人如何通常封裝一堆這樣的行爲,而不需要使用它的類中的大量重複代碼?我是否需要向我的ComposerProxy添加一個委託類,並讓控制器負責解除假設的composerDidFinish方法中的模式視圖控制器?

很多TIA!

回答

1

從我上面看到的情況來看,崩潰並不一定意味着糟糕的設計 - 很可能是因內存管理問題而崩潰。也許控制器過度發佈,很難說 - 你會得到什麼樣的崩潰?

儘管當前的設計看起來不錯,但另一種方法是在UIViewController上創建category。該類別將添加(導入類別的UIViewController子類)用於呈現模態TTMessageController所需的所有代碼,而不要求您複製或使用繼承。

@interface UIViewController (Composer) 
// categories can't add instance vars, so return the new controller if you need to store it... 
- (TTMessageController *)presentMessageController; 
@end 

@implementation UIViewController (Composer) 
- (TTMessageController *)presentMessageController { 
    // contents of ComposerProxy#go except referring to 'self' instead of 'self.controller' 
} 
@end 
+0

啊,我沒有想過要添加一個類別。這是一個非常好的主意(我已經爲其他東西做了,而不是控制器)。我想這個類別也會添加它實現的代理。 我認爲,內存問題是因爲調用類不會將代理對象保留在實例屬性中,所以如果它釋放它,它將無法正常工作,因爲沒有對它的引用。一直在思考是否有辦法解決這個問題,但是隨着一個類別可能是一個更好的主意。謝謝! – theory 2010-04-16 18:34:21

相關問題