1

ルート ビューで設定ボタンがタップされたときに呼び出されるメソッドがあります。このメソッドは、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. ビュー 1 が開いています。フィールドのデータを変更します。
  2. ビュー 2 のタブをタップします
  3. ビュー 2 に対して viewWillAppear が呼び出され、ビュー 2 のフィールドにデータベース内の古いデータが入力されます。
  4. 次に、ビュー 1 に対して viewWillDisappear が呼び出され、変更されたデータがデータベースに保存されます。

終了ビューがviewWillDisappearを呼び出す前に、開始ビューがviewWillAppearを呼び出しているようです。

シングルトンを使用するなど、この他の方法を試してみましたが、両方のビューからrecordIndexを変更しようとしただけで、すべての場合、データは閉じたビューから保存される前に開いたビューからロードされたようです。

これは 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 に答える