1

直到今天,我有一个非常简单的应用程序。它有一个带有 3 个标签的标签栏视图控制器。中间的选项卡是一个相机,另外两个是表格视图。标签栏视图控制器是应用程序中所有数据的中心枢纽。所以从那里,我将一个表的数据数组设置为:

(PLEListViewController*)[self.viewControllers objectAtIndex:0] setList:newList];

显然,PLEListViewController是我的UITableView子类。

所以现在,我想将表格视图包装在 a 中UINavigationController,这非常简单。但是现在,那行代码变成了:

[(PLEListViewController*)((UINavigationController*)[self.viewControllers objectAtIndex:0]).topViewController setList:newList];

代码中有 15 行执行此操作,这并不令人愉快。

所以我的问题是:我错过了什么更优雅的方法?

4

3 回答 3

4

很高兴您现在提出这个问题并看到这个问题。您的问题可以在您的问题中找到。“在 Objective C 中几个不同的视图控制器之间进行通信的正确方法”的答案是“不要”。具体来说,您的错误在这里:

标签栏视图控制器是应用程序中所有数据的中心枢纽。

视图控制器不应该保存应用程序中的任何数据。您的数据应该存在于您的模型类中。所有视图控制器都应该与模型类对话。他们应该很少互相交谈。这就是 MVC 的核心。

因此,您将“列表”(无论是什么,都无所谓)移动到所有视图控制器都知道的模型对象中。该模型对象可以是单例的,或者更好的是,它可以在创建视图控制器时传递给视图控制器。当事情发生变化时,你会改变模型。并在viewWillAppear:您更新视图控制器以匹配模型的当前状态。

永远不要假设视图控制器当前不在屏幕上时存在。如果您的设计要求存在非活动视图控制器,那么您的设计需要修复。

于 2013-01-26T23:02:33.433 回答
4

您需要使用您的架构。制定适当的数据源和委托协议,以确保您的类可以匿名通信。您目前拥有的东西非常不灵活,并且随着您的应用程序的增长/变化,它会变得更糟。

于 2013-01-25T21:24:26.390 回答
1

您希望使事情更加松散耦合,而不是在代码中对对象之间的链接进行显式遍历。

假设您有一个数据模型显示在应用程序的各个位置,我认为有两种方法可以帮助...

一种是使用您的视图控制器层次结构。例如,使用[ self enclosingTabBarController ]查找您最近的父标签栏控制器并获取它的数据模型属性。-enclosingTabBarController用更适合您的应用程序的方法代替。

另一种方法是“作为单例的数据模型”方法。为此,您可以

  • 将数据移动到您的应用程序委托并通过以下方式访问它((MyApplicationDelegateClass*)[ UIApplication sharedApplication ].delegate).dataModel

或者

  • 为您的应用程序提供一个单例数据模型对象,并通过以下方式访问它[ MyDataModelClass sharedModel ]

无论如何,您正在转向更松散的耦合,这需要较少显式地遍历应用程序中对象之间的链接。少即是多!

于 2013-01-26T23:05:12.853 回答