如何从app delegate访问uitabbarcontroller内的uinavigationcontroller中的uitableview?

ske*_*eg0 0 objective-c uitabbarcontroller uitableview uinavigationcontroller appdelegate

我试图在一个uitableview中访问一个刷新控制方法,该方法位于导航控制器内部,这是一个tabbarcontroller,这是我的根,但我很难得到一个精确的句柄.

这是我到目前为止在AppDelegate中的代码,但它不起作用...

UITableViewController *tableView = (UITableViewController *)[[self.tabbarController viewControllers][0] tableView];
    [tableView.refreshControl beginRefreshing];
Run Code Online (Sandbox Code Playgroud)

我有5个标签栏项目,我相信我可以通过[0],[1],[2],[3]和我在UITableView中的代码访问(尽管可能无关紧要)...

// Add Refresh Control
    UIRefreshControl *refreshControl = [[UIRefreshControl alloc] init];
    [refreshControl addTarget:appDelegate action:@selector(forceDownload) forControlEvents:UIControlEventValueChanged];
    self.refreshControl = refreshControl;
    [refreshControl release];
Run Code Online (Sandbox Code Playgroud)

任何帮助将不胜感激,因为我无法找到任何在线访问这么深的.

Lui*_*oza 6

如果您需要在不相关的对象之间进行通信,我认为最好的选择是使用NSNotifications.这允许您使用单例对象[NSNotificationCenter defaultCenter],将通知从一个对象传递到另一个对象(或许多其他对象).

因此,您可以将AppDelegate对象(或其他对象)观察到特定通知,然后在需要刷新控件时使用tableviewController发布通知.

在app delegate类中,您可以添加以下观察者:

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(forceDownload)
                                             name:@"ForceDownloadNotification"
                                           object:nil];
Run Code Online (Sandbox Code Playgroud)

并且,在tableviewController中,您可以发布de通知,如:

[[NSNotificationCenter defaultCenter] postNotificationName:@"ForceDownloadNotification" 
                                                    object:self];
Run Code Online (Sandbox Code Playgroud)

在这里,我使用名称"ForceDownloadNotification"作为通知的名称.您可以使用所需的名称,但为了使此解决方案正常工作,您必须在开始观察时和发布通知时使用相同的名称.

这里有一个关于这个主题的教程.