我喜欢 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,因为它更简单,但这并不意味着我们无法按照您最初计划的方式访问对象。
(如果您想要示例代码,请索取)。
问候。