1

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

我现在遇到的麻烦是一个设计问题:我想在两个不同的地方以相同的方式使用它,包括使用相同的委托方法。我目前的方法是将所有代码放入一个继承自的类中NSObject,称为ComposerProxy,我只是让使用它的两个控制器使用代理,如下所示:

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

go方法构造TTMessageController,配置它,将其添加到 a UINavigationController,并呈现它:

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

这很好用,因为我已经很好地封装了我的所有代码ComposerProxy,我只需要上面两行我想使用它的任何地方。

但是,不利的一面是我不能deallocproxy不崩溃的情况下使用变量。我也做不到autorelease:同样的问题。

所以我想知道我的代理方法是否很糟糕。通常如何在不需要在使用它的类中大量重复代码的情况下封装一堆这样的行为?我是否需要向我添加一个委托类ComposerProxy并让控制器负责以假设composerDidFinish方法或类似方法关闭模态视图控制器?

许多TIA!

4

1 回答 1

1

从我上面看到的情况来看,崩溃并不一定表明设计不佳 - 很可能是因为内存管理问题而崩溃。也许控制器过度释放,很难说 - 你得到什么样的崩溃?

虽然当前的设计看起来不错,但另一种方法是在 UIViewController 上创建一个类别。该类别将添加(到导入该类别的 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
于 2010-04-16T17:01:32.823 回答