1

我有一个在我的根视图中点击设置按钮时调用的方法,它子类化两个 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. 视图 1 已打开。我更改了字段中的数据。
  2. 我点击查看 2 的选项卡
  3. 为视图 2 调用 viewWillAppear,用数据库中的旧数据填充视图 2 中的字段。
  4. 然后为视图 1 调用 viewWillDisappear,将更改的数据保存到数据库中。

似乎在关闭视图调用 viewWillDisappear 之前,打开视图正在调用 viewWillAppear。

我已经尝试过其他方法,例如使用单例,并且只是尝试从两个视图中修改记录索引,并且在所有情况下,似乎数据是从打开视图加载的,然后再从关闭视图保存。

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

4

2 回答 2

1

这不是一个好的设计。不能保证新视图的 viewWillAppear 应该在前一个视图的 viewWillDisappear 之后调用。即使这样可以工作,也不能保证这将在未来的 iOS 版本中继续工作。

如果性能不受影响,快速修复可能是在发生更改时将更改保存到数据库中,您将始终拥有一个可以在任何情况下从任何视图访问的最新数据库。

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

于 2012-11-17T09:59:35.063 回答
0

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

于 2012-11-17T10:15:15.403 回答