ルート ビューで設定ボタンがタップされたときに呼び出されるメソッドがあります。このメソッドは、2 つの 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 メソッドをオーバーライドして、主キー recordIndex で sqlite データベースからデータ行をロードします。(どちらのビューも同じレコードを取得し、レコードから異なるデータを表示します。ただし、1 つのフィールドが両方で同じです。)
また、各ビューで viewWillDisappear をオーバーライドして、コントロール データをデータベースに保存します。
タブ バーを使用してビューを切り替えるたびに、閉じているビューで viewWillDisappear メソッドが呼び出され、開いているビューで viewWillAppear メソッドが呼び出されることを確認できます。
問題は、最初のビューでデータを変更して 2 番目のビューに切り替えると、最初のビューに戻ってから 2 番目のビューに戻らない限り、2 番目のビューでデータが変更されないことです。私が知る限り、ここで何が起こっているようです:
- ビュー 1 が開いています。フィールドのデータを変更します。
- ビュー 2 のタブをタップします
- ビュー 2 に対して viewWillAppear が呼び出され、ビュー 2 のフィールドにデータベース内の古いデータが入力されます。
- 次に、ビュー 1 に対して viewWillDisappear が呼び出され、変更されたデータがデータベースに保存されます。
終了ビューがviewWillDisappearを呼び出す前に、開始ビューがviewWillAppearを呼び出しているようです。
シングルトンを使用するなど、この他の方法を試してみましたが、両方のビューからrecordIndexを変更しようとしただけで、すべての場合、データは閉じたビューから保存される前に開いたビューからロードされたようです。
これは UITabBarController の動作のバグですか、それとも私が想定していない方法で viewWillAppear と Disappear を悪用していますか? 他の誰かがこの動作に遭遇しましたか?