2

SimpleEKDemo サンプルには、RootViewController.m ファイルの viewDidLoad の最後に「[self.tableView reloadData]」があります。

これは必要ですか?この行が挿入された理由はありますか? 「cellForRowAtIndexPath」などのメソッドへのデリゲートへの呼び出しを介してviewDidLoadの後にビューが描画されませんか?

- (void)viewDidLoad {
    self.title = @"Events List";

    // Initialize an event store object with the init method. Initilize the array for events.
    self.eventStore = [[EKEventStore alloc] init];

    self.eventsList = [[NSMutableArray alloc] initWithArray:0];

    // Get the default calendar from store.
    self.defaultCalendar = [self.eventStore defaultCalendarForNewEvents];

    //  Create an Add button 
    UIBarButtonItem *addButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:
                                UIBarButtonSystemItemAdd target:self action:@selector(addEvent:)];
    self.navigationItem.rightBarButtonItem = addButtonItem;
    [addButtonItem release];


    self.navigationController.delegate = self;

    // Fetch today's event on selected calendar and put them into the eventsList array
    [self.eventsList addObjectsFromArray:[self fetchEventsForToday]];

    [self.tableView reloadData];   // ** REALLY NEEDED ** 

}

編集 - doco でこれに注意しました (以下を参照) - 上記のコード行がどのように必要とされるかはまだ明確ではありません - 別のビューに移動してからこのビューに戻った場合、そうではありませんか? THEN (a) ビューが再初期化された場合は、ビュー自体を再設定する必要があります。または (b) ビューが再初期化されていない場合は、「viewDidLoad」メソッドが呼び出されないため、どちらの場合でも、viewDidLoad メソッドの最後に「reloadData」コード行を配置しますか?

UITableView は UIView の layoutSubviews メソッドをオーバーライドして、UITableView の新しいインスタンスを作成するとき、または新しいデータ ソースを割り当てるときにのみ reloadData を呼び出すようにします。テーブル ビューを再読み込みすると、現在の選択を含む現在の状態がクリアされます。ただし、reloadData を明示的に呼び出すと、この状態がクリアされ、以降の直接的または間接的な layoutSubviews の呼び出しはリロードをトリガーしません。

4

1 に答える 1

3

これは、静的データがある場合は実際には必要ありませんが、データ ソースからテーブルの内容を更新する場合は必要です。

例えば

テーブルに入力したレコードを追加し、それを追加するときにそのデータをテーブルに表示したいとします。最初のページにテーブルがあり、2 番目のビューにレコードを追加して最初のビューに戻ります。新しいデータを表示しますが、今回はテーブルのデータソースメソッドが呼び出されていないため、データをリロードする必要があるため、この行はテーブルのデータソースメソッドを呼び出します。

状況はご理解いただけると思います。

編集:

行を削除すると、そのデータはデータベースから削除されますが、テーブルで削除を呼び出さないとテーブルに残ります。今、あなたはデータベース関数を呼び出して、viewWillAppear関数で配列にレコードを取得しています.commitEditingStyle関数からviewWillappearを呼び出し、viewWillappearでテーブルをリロードするだけです.この状況では、テーブルをリロードする必要があります.

于 2011-02-28T05:01:36.657 に答える