如何在两个控制器中使用相同的modalViewController?

时间:2010-04-16 03:05:08

标签: iphone objective-c cocoa-touch oop modalviewcontroller

我在我的应用中使用Three20 TTMessageController。我已经弄清楚如何使用它,添加了许多其他东西(包括TTMessageControllerDelegate方法和ABPeoplePickerNavigationControllerDelegate方法)。经过一番努力解决后,它对我来说很有用。

我现在遇到的麻烦是设计问题:我想在两个不同的地方使用它,包括使用相同的委托方法。我目前的方法是将所有代码放入一个继承自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 个答案:

答案 0 :(得分: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