视图控制器之间的通信

2024-02-03

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

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

@implementation SecondLevelViewController

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

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

我还看到了关于委托形式的争论,其中分配的 id 对象将用于第二个控制器(而不是上面保留的 User 实例变量)。

如果有人能为我澄清这个立场,那就太好了,因为我对这个领域看似相互矛盾的建议感到非常困惑。视图控制器之间通信的最佳方式是什么?

2)我的第二个问题也与控制器的结构有关。我见过一些示例,其中根控制器(在上面的排列中)具有一系列实例化的二级控制器。这在专业应用程序中是否正常,或者以这种方式执行操作是否会对内存产生重大影响(即无延迟加载)?我认为该阵列的优点是减少了二级控制器的加载时间?

感谢您的任何回复,因为我正在尝试正确地开发事物而不是将它们拼凑在一起。


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

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

2)“我见过一些示例,其中根控制器(在上面的安排中)具有一系列实例化的二级控制器。这在专业应用程序中是否正常”

首先,您应该将您在 SO 上的帖子限制为每个帖子一个问题。视图控制器本身对内存的影响通常非常低。它的实例变量只需要几百个字节。内存密集型部分是视图本身。 UIViewController 的视图加载/卸载机制将在需要时小心地卸载内存密集型视图(即,如果它收到内存警告并且视图当前不在屏幕上)。所以只要你执行viewDidLoad, viewDidUnload and didReceiveMemoryWarning正确的是,我不会太担心视图控制器数组的内存消耗。

UITabBarController 也拥有一个子控制器数组,所以这没有任何问题。不过,您应该避免的是一个控制器包含整个子控制器层次结构(即不仅是第二级,还有第三级等):与其说是因为内存问题,不如说是为了避免不必要的耦合。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

视图控制器之间的通信 的相关文章

随机推荐