我喜欢 Luis Espinoza 的方法,但这本身并不能回答问题。
如果您想调用嵌套在 UINavigationController 中的 UITableViewController 中的方法,该 UINavigationController 是您的 App Delegate 的 rootViewController。首先,我们使用 UITableViewController(或子类)创建一个 navigationController:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
// Override point for customization after application launch.
CustomTableViewController *nuTableVC = [[CustomTableViewController alloc] initWithStyle:UITableViewStylePlain];
UINavigationController *nuNavController = [[UINavigationController alloc] initWithRootViewController:nuTableVC];
self.window.rootViewController = nuNavController;
[self.window makeKeyAndVisible];
return YES;
}
然后在你的 UITableViewController (或子类)中你设置刷新控件就像你问的那样:
- (void)viewDidLoad {
[super viewDidLoad];
// Add Refresh Control
UIRefreshControl *refreshControl = [[UIRefreshControl alloc] init];
[refreshControl addTarget:[[UIApplication sharedApplication] delegate]
action:@selector(forceDownload)
forControlEvents:UIControlEventValueChanged];
self.refreshControl = refreshControl;
}
最后要访问 UItableViewController 您必须检查实例是否真的是您想要的类,这是我在您的App Delegate中创建的方法( forceDownload)的实现:
- (void)forceDownload {
NSLog(@"force download method in App Delegate");
UINavigationController *someNavController = (UINavigationController*)[_window rootViewController];
UIViewController *vcInNavController = [[someNavController viewControllers] objectAtIndex:0];
if ([vcInNavController isKindOfClass:[CustomTableViewController class]]) {
NSLog(@"it is my custom Table VC");
NSLog(@"here we can stop the refresh control, or whatever we want");
CustomTableViewController *customTableVC = (CustomTableViewController *)vcInNavController;
[customTableVC.refreshControl performSelector:@selector(endRefreshing)
withObject:nil
afterDelay:1.0f];
}
}
我个人更喜欢使用 NSNotificationCenter 因为它更简单,但这并不意味着我们不能按照您最初计划的方式访问对象。
(如果您想要示例代码,请索取)。
问候。