正确遍历ViewController层次结构?

时间:2010-11-27 07:24:19

标签: objective-c cocoa-touch ios

我无法从另一个视图控制器引用它。代码有效,但我收到警告,这让我觉得我错了。我正在尝试重新加载tableViewcontroller位于NavigationController的数据。
这样的消息出了什么问题:

来自AppDelegate:

[self.tabBarController.selectedViewController.topViewController.tableView reloadData];

虽然这有效,但我收到警告request for member 'topViewController' in something not a structure or union,因为Xcode不知道selectedViewController会返回navigationController。所以我可以做以下事情:

UINavigationController *myNavigationController = self.tabBarController.selectedViewController;
[myNavigationController.topViewController.tableView reloadData];

但接着我收到了这个警告:incompatible Objective-C types initializing 'struct UIViewController *', expected 'struct UINavigationController *'

我需要走多远?第一行有效。要达到“正确的方式”是否需要8行代码?

2 个答案:

答案 0 :(得分:4)

这里有一个主要代码味道,IMO。你正试图在(很棒的)距离上采取行动。目前还不清楚你要完成什么,也不清楚为什么你需要从app delegate做这个动作。我已经看到一些开发人员将应用程序代理视为一个巨大的全球性泥浆,我认为这是一种应该从iOS开发中消除的反模式。

回到你的问题:你正试图在标签视图控制器内强制一个表视图控制器来重新加载它的数据。我假设这是对发生的事情的回应。为什么没有负责该表的视图控制器观看该事件而不是应用程序代理?这样,拥有表视图的东西就是直接控制它 - 这是MVC模式的全部要点。这比使应用程序委托向下钻取层次结构以查找表视图(在复杂性,可读性和脆弱性方面)要好得多。

如果由于某种原因,您不能或不会让视图控制器直接观察事件(很难理解为什么随意),您可以随时让应用程序委托发布NSNotification并让负责表的视图控制器作为观察者注册。不如直接观察,但肯定比你目前的方法更好。

答案 1 :(得分:2)

除非编译器知道您正在使用它的对象类型,并且该对象类型可以接收具有该名称的消息,否则不能使用点符号。

你可以使用带有一堆类型转换的点符号(在这种情况下,它非常难看):

[((UITableViewController *) ((UINavigationController *) self.tabBarController.selectedViewController).topViewController).tableView reloadData];

或者您可以将其分解为不连续的步骤:

UINavigationController *navController = (UINavigationController *) self.tabBarController.selectedViewController;
UITableViewController *tableViewController = (UITableViewController *) navController.topViewController;
[tableViewController.tableView reloadData];

请注意,我假设你的顶级VC是UITableViewController的子类。

您实际上不应该在外部访问.tableView属性 - 您应该在View Controller本身上使用reloadData方法封装该行为。即使它只是在reloadData上调用.tableView,也应该封装它。这将使您的代码更加模块化(这使您更容易理解为您和其他人),并使其更容易扩展并增加View Controller的复杂性。

如果不确切知道这个应用程序是如何构建的,我猜你可能最好使用通知或观察器来让你的VC重新加载它的数据。如果您有一些需要刷新UI的全局事件,NSNotification是让UI层获取消息同时保持代码良好和模块化的好方法。

相关问题