2010-04-16 113 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

相关问题