我有一个在我的根视图中点击设置按钮时调用的方法,它子类化两个 UIViewController,将它们附加到 UITabBarController 并将 UITabBarController 推送到导航堆栈上:
-(IBAction)onSettings:(id)sender {
// Create the Settings Views
SettingsViewController *vcSettings1 = [[Settings1ViewController alloc] initWithNibName:@"Settings1ViewController" bundle:nil];
Settings2ViewController *vcSettings2 = [[Settings2ViewController alloc] initWithNibName:@"Settings2ViewController" bundle:nil];
// Create the Tab View
UITabBarController *tabController= [[UITabBarController alloc] init];
tabController.viewControllers = @[vcSettings1,vcSettings2];
// Pass the Index of the database on to the views so they can pull the record from the database
vcSettings.recordIndex = recordIndex;
vcSettings2.recordIndex = recordIndex;
// Add the tab bar controller to the navigation stack
[self.navigationController pushViewController:tabController animated:YES];
}
在每个设置视图中,我重写 viewWillAppear 方法以从主键记录索引处的 sqlite 数据库加载一行数据。(两个视图都提取相同的记录并从记录中显示不同的数据,但两者的一个字段相同。)
我还在每个视图中覆盖 viewWillDisappear 以将控件数据保存回数据库。
我可以验证每次使用标签栏切换视图时,都会在一个关闭视图上调用 viewWillDisappear 方法,而在打开视图上调用 viewWillAppear 方法。
问题是当我在第一个视图上更改数据并切换到第二个视图时,除非我返回第一个视图然后再返回第二个视图,否则第二个视图上的数据不会更改。据我所知,这似乎正在发生:
- 视图 1 已打开。我更改了字段中的数据。
- 我点击查看 2 的选项卡
- 为视图 2 调用 viewWillAppear,用数据库中的旧数据填充视图 2 中的字段。
- 然后为视图 1 调用 viewWillDisappear,将更改的数据保存到数据库中。
似乎在关闭视图调用 viewWillDisappear 之前,打开视图正在调用 viewWillAppear。
我已经尝试过其他方法,例如使用单例,并且只是尝试从两个视图中修改记录索引,并且在所有情况下,似乎数据是从打开视图加载的,然后再从关闭视图保存。
这是 UITabBarController 工作方式中的错误,还是我以不应该的方式滥用 viewWillAppear 和 Disappear?有没有其他人遇到过这种行为?