我有三个 ViewController:
RootViewController
FirstViewController
SecondViewController
从 RootViewController 中,我使用其他两个 ViewController 创建一个 TabBarController。所以我需要做类似的事情:
FirstViewController *viewController1 = [[FirstViewController alloc] initWithNibName:@"FirstViewController" bundle:nil];
SecondViewController *viewController2 = [[SecondViewController alloc] initWithNibName:@"SecondViewController" bundle:nil];
然后将控制器添加到TabBarController。 在那一刻,我的两个 ViewController 被实例化。
要更新数据,我已在我的
FirstViewController.m
中尝试过此操作:
SecondViewController *test = [[SecondViewController alloc] init];
[test.tableView reloadData];
但是什么也没有发生,我想是因为我的 SecondViewController 之前已被分配,并且正在创建它的一个新实例。
如何从 FirstViewController 更新 SecondViewController 中表的数据?
让根视图控制器在创建视图控制器时将 viewController2 的值传递给 viewController1。将属性描述为弱属性,因为您希望 rootController 拥有它们,而不是其他 viewController。
如果您尝试更新第二个视图控制器中使用的数据而不需要切换,我将使用委托模式。
在 FirstViewController 中创建协议声明,例如
@class FirstViewController;
@protocol FirstViewControllerDelegate
-(void) updateDataFromFirstViewController: (NSMutableArray*)newArray;
@end
@property (strong, nonatomic) id<FirstViewControllerDelegate>delegate;
然后在你的第一个ViewController中,当你有新数据要更新时调用
[self.delegate updateDataFromFirstViewController:yourNewData];
在SecondViewController.m中实现该方法,并将委托添加到SecondViewController.h中
SecondViewController: UIViewController <FirstViewControllerDelegate>
然后在
-(void) viewWillAppear:(BOOL)animated
重新加载表数据,以便当您真正需要查看更新的数据时,它会在您切换时出现。另外,不要忘记在 SecondViewController 中将 FirstViewController 委托设置为 self。
你的
TabBarController
持有FirstViewController
和SecondViewController
吗?在TabBarController
中,有一个属性-viewControllers
。它是一个数组,因此您可以使用它来访问您的 viewController。
[tabBarController.viewControllers objectAtIndex:0];//This is your First viewController
[tabBarController.viewControllers objectAtIndex:1];//This is your Second viewController
然后访问sencondViewController的tableView并重新加载。
希望这有帮助。
你可以这样访问第二个ViewController:
UITabBarController *tabController = (UITabBarController *)[self parentViewController];
[tabController.viewControllers enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
if ([obj isKindOfClass:[SecondViewController class]]) {
SecondViewController *secondController = obj;
[secondController.tableView reloadData];
*stop = YES;
}
}];