UITabBarController似乎在关闭另一个视图之前打开一个视图

时间:2012-11-17 05:37:26

标签: ios xcode cocoa uitabbarcontroller

我有一个在我的根视图中点击“设置”按钮时调用的方法,该子类包含两个UIViewControllers,将它们附加到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];
}

在每个Settings视图中,我覆盖viewWillAppear方法,以从主键recordIndex的sqlite数据库加载一行数据。 (两个视图都会拉出相同的记录并显示记录中的不同数据,但两个字段在两者上都相同。)

我还在每个视图中覆盖viewWillDisappear,以将控件数据保存回数据库。

我可以验证每次使用标签栏切换视图时,都会在一个结束视图上调用viewWillDisappear方法,并在开始视图上调用viewWillAppear。

问题是当我在第一个视图上更改数据并切换到第二个视图时,除非我返回到第一个视图然后返回到第二个视图,否则第二个视图上的数据不会更改。我能说的最好,这就是正在发生的事情:

  1. 查看1已打开。我在字段中更改了数据。
  2. 点击View 2的标签
  3. 为View 2调用viewWillAppear,使用数据库中的旧数据填充View 2中的字段。
  4. 然后为View 1调用
  5. viewWillDisappear,将更改的数据保存到数据库中。
  6. 在关闭视图调用viewWillDisappear之前,开放视图似乎正在调用viewWillAppear。

    我尝试过其他方法,例如使用单例,只是尝试从两个视图中修改recordIndex,并且在所有情况下,似乎在从关闭视图保存数据之前从开始视图加载数据。

    这是UITabBarController工作方式的错误,还是我以一种我不应该的方式滥用viewWillAppear和Disappear?有没有其他人遇到这种行为?

2 个答案:

答案 0 :(得分:1)

这不是一个好的设计。无法保证在上一个viewWillDisappear之后应该调用viewWillAppear的新视图。即使它能够正常工作,也无法保证这将在未来的iOS版本中继续运行
如果性能不受影响,快速修复可能是在数据库发生变化时保存更改,您始终可以在任何情况下从任何视图访问最新数据库。

最好的设计是拥有一些模型类,例如可以通过单例访问模型对象。这些模型对象在您与UI交互时实时更新,它们是由不同视图访问的模型对象,并且使用您选择的方法定期保存它们。

答案 1 :(得分:0)

作为一种廉价的解决方案,您可以在viewDidAppear中加载数据,但总的来说我同意JP的回答