1

アプリケーションに問題があります。どんな助けでも大歓迎です。基本的には、ビューAからビューBに移動してから、ビューBから戻ります。

ビューAでは、データベースから動的データがロードされ、テーブルビューに表示されます。このページには、ナビゲーションバーではなく、編集ボタンもあります。ユーザーが編集ボタンをタブで移動すると、ビューBに移動し、ピックビューが表示されます。また、ユーザーはここで変更を加えることができます。それが完了すると、ユーザーはナビゲーションバーの[戻る]ボタンをタブで移動し、変更をNSUserDefaultsに保存し、ビューBをポップしてビューAに戻ります。

ビューAに戻ると、UIUserDefaultsから新しいデータを取得する必要があります。NSLogを使用してコンソールに印刷しましたが、正しいデータが表示されます。また、viewWillAppear:メソッドを呼び出して、テーブルビューの新しいデータを取得する必要がありますが、そうではありませんでした。tableView:numberOfRowsInSection:メソッドも呼び出されませんでした。このメソッド内にNSLogステートメントを配置しましたが、コンソールに出力されませんでした。

その結果、ビューAにはまだ古いデータがあります。ビューAで新しいデータを取得する唯一の方法は、アプリケーションを停止して開始することです。

ビューAとビューBはどちらも、UIViewControllerUITableViewDelegateのサブクラスですUITableViewDataSource

これがビューAの私のコードです:

- (void)viewWillAppear:(BOOL)animated {
    NSLog(@"enter in Schedule2ViewController ...");

    // load in data from database, and store into NSArray object

    //[self.theTableView reloadData];
    [self.theTableView setNeedsDisplay];
    //[self.theTableView setNeedsLayout];
}

ここで、「theTableView」はUITableView変数です。そして、「reloadData」、「setNeedsDisplay」、「setNeedsLayout」の3つのケースすべてを試しましたが、機能しなかったようです。

ビューBで、ナビゲーションバーの戻るボタンに対応するメソッドは次のとおりです。

- (void)viewDidLoad {
    UIBarButtonItem *saveButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemSave target:self action:@selector(savePreference)];
    self.navigationItem.leftBarButtonItem = saveButton;
    [saveButton release];
}

- (IBAction) savePreference {
    NSLog(@"save preference.");

    // save data into the NSUSerDefaults

    [self.navigationController popViewControllerAnimated:YES];
}

私は正しいやり方でやっていますか?それとも私が見逃したものはありますか?

4

2 に答える 2

3

ビューが最初に読み込まれると、viewDidLoad メソッドが呼び出されます。スタックを作成する場合、(A から B に) ドリルダウンしてから (B から A) に戻り、A で viewDidLoad が再度呼び出されることはありません。 )、viewDidLoad メソッドを呼び出して新しいデータを取得してから、tableView の reloadData メソッドを呼び出して、テーブル ビューを再入力します。

データのフェッチと設定機能を viewDidLoad メソッドから取り出して、独自の getData メソッドに配置することをお勧めします。getData メソッドの最後に、 を配置し[self.tableView reloadData];て、テーブル ビューをリセット/再入力できます。クラス B から呼び出し[self getData]て、クラス B で行う作業の量を最小限に抑えることができます。これにより、そのコードの再利用性が向上し、viewDidLoad メソッドの呼び出しによる副作用を防ぐことができます。

于 2009-07-28T21:38:20.867 に答える
1

viewDidAppear を使用することもできます。画面が表示されるたびに呼び出されます。パフォーマンス上の理由から、フラグを設定して、最初の画面ビューで viewDidAppear を使用して viewDidLoad で同じ機能を繰り返さないようにします。

于 2010-03-22T22:43:29.550 に答える