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

Posted

技术标签:

【中文标题】如何在两个控制器中使用相同的 modalViewController?【英文标题】:How do I use a modalViewController Identically in Two Controllers? 【发布时间】:2010-04-16 03:05:07 【问题描述】:

我在我的应用程序中使用Three20 TTMessageController。我想出了如何使用它,添加了一堆其他的东西(包括TTMessageControllerDelegate 方法和ABPeoplePickerNavigationControllerDelegate 方法)。经过一番努力后,它对我来说非常有用。

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

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

go 方法构造 TTMessageController,对其进行配置,将其添加到 UINavigationController,并呈现:

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

这很好用,因为我的所有代码都很好地封装在 ComposerProxy 中,我只需要上面两行代码就可以使用它。

不过,缺点是我不能在deallocproxy 变量中不崩溃。我也不能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

【讨论】:

啊,我没想到要添加一个类别。这是一个非常好的主意(我已经为其他东西做过,只是不是控制器)。我想该类别也添加了它实现的任何代表。我认为内存问题是因为调用类没有将代理对象保留在实例属性中,所以如果它释放它,它就不能正常工作,因为没有对它的引用。一直在思考是否有办法解决这个问题,但无论如何,选择一个类别可能是一个更好的主意。谢谢!

以上是关于如何在两个控制器中使用相同的 modalViewController?的主要内容,如果未能解决你的问题,请参考以下文章

如何连续关闭两个模态视图控制器*动画*?

如何在 laravel 上以一种形式使用两个控制器方法?

如何强制旋转 UIViewController

如何在另一个视图中使用已经初始化的类?

如何检查两个 Java 类在语义上是不是相同?

如何使用自定义视图控制器创建同一屏幕的两个部分