视图控制器之间的通信

时间:2009-12-10 10:19:44

标签: iphone objective-c uiviewcontroller uinavigationcontroller communication

鉴于具有UINavigationController和2级UITableViews的应用程序部分(即在根控制器上选择了一行将第二个控制器推入导航堆栈),我有以下问题:

1)两个控制器都需要一个User对象。两个控制器之间通信的最佳方式是什么?我在这个网站上看过一篇提及依赖注入的文章,并且根控制器可以通过以下方式将User对象传递给第二级控制器:

@implementation SecondLevelViewController

-(void) initWithUser: (User *) user {
   // myUser is an instance variable
   myUser = user;
   [myUser retain];
}

在该示例中,第二个控制器似乎保留了用户,而我已经看到其他来源(例如斯坦福iPhone开发课程),它主张在这种情况下简单地分配用户,而不是保留用户(松耦合)。 / p>

我还看到了一种委托形式的参数,其中在第二个控制器上使用分配的id对象(而不是如上所述的保留的User实例变量)。

如果有人能为我澄清这个立场会很好,因为我对这方面看似矛盾的建议极为困惑。视图控制器之间通信的最佳方式是什么?

2)我的第二个问题也与控制器的结构有关。我已经看到了根控制器(在上面的安排中)有一个实例化的第二级控制器数组的例子。这在专业应用程序中是正常的,还是会以这种方式对事物产生重大的内存影响(即没有延迟加载)?我假设阵列的优点是减少了第二级控制器的加载时间?

感谢您的任何回复,因为我正在尝试正确开发而不是一起破解它们。

2 个答案:

答案 0 :(得分:3)

1)“视图控制器之间进行通信的最佳方式是什么?”

没有一种“最好”的方式。您当然可以在初始化时将模型对象传递给视图控制器。在这种情况下,控制器通常应保留模型。如果您正在编写一个侧重于可重用性的通用视图控制器类(例如UITableViewController),那么使用委托是一个不错的选择。

2)“我见过根控制器(在上面的安排中)有一个实例化的第二级控制器数组的例子。这在专业应用程序中是正常的”

首先,您应该将SO上的帖子限制为每个帖子一个问题。视图控制器本身的内存影响通常很低。它的实例变量只需要几百个字节。内存密集型部分是视图本身。并且UIViewController的视图加载/卸载机制将在需要时注意卸载内存密集型视图(即,如果它收到内存警告并且视图当前不在屏幕上)。因此,只要您正确实现viewDidLoadviewDidUnloaddidReceiveMemoryWarning,我就不会过多担心视图控制器数组的内存消耗。

UITabBarController也拥有一系列子控制器,因此没有任何问题。但是,您应该避免的是,一个控制器要保持整个子控制器层次结构(即不仅是第二级,还包括第三级等):不是因为内存问题而是避免不必要的耦合。

答案 1 :(得分:1)

通常,您应该尽量避免在控制器之间直接传递数据。

您可以设置每个控制器都可以访问的模型,然后您可以实现通知以通知其他控制器发生了某些事情。另一个控制器可以从模型中获取所需的任何数据。

这样就可以让控制器分开。