2009-07-13 10 views
1

私のアプリケーションに問題があります。どんな助けでも大歓迎です。基本的にビューAからビューBになり、ビューBから戻ってきます。別のビューから戻った後のテーブルビューからのデータのリロード

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

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

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

ビューAとビューBの両方は、UIViewControllerのサブクラスであり、UITableViewDelegateUITableViewDataSourceです。ここで

は、ビュー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]; 
} 

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

答えて

3

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

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

1

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

関連する問題