2011-10-11 11 views
2

refreshRowsという方法でテーブルをロードするたびに、ステータスがWebアプリケーションから取得される一連のアイテムを含むUITableViewがあります。私がこれをした後、私はテーブルをリロードします。Reload UITableViewビューを再読み込みせずにデータをロードしますか?

テーブルにアイテムを追加したとき、「無効な更新:セクション内の行数が無効です」というメッセージが表示されました。テーブルのデータを再読み込みする必要があることが判明したので、私は古いものから新しいviewDidAppearのメソッドに変更しました(どちらも下に示します)。私は今、2つのreloadDataコールを持っています。どちらも私のビューをリフレッシュします。

質問:これを行うにはクリーンな方法がありますか?追加した後、データをリロードする必要がありますが、Webからのすべてのステータスが取得されるまで、ビューをリロードしないことをお勧めします。

- (void)viewDidAppear:(BOOL)animated // new 
{ 
    NSLog(@"viewDidAppear"); 
    [super viewDidAppear:animated]; 

    [self.tableView reloadData]; // <------------- Prettier way to do this? 
    [self refreshRows]; 
    [self.tableView reloadData]; 

} 

- (void)viewDidAppear:(BOOL)animated // old 
{ 
    NSLog(@"viewDidAppear"); 
    [super viewDidAppear:animated]; 

    [self refreshRows]; 
    [self.tableView reloadData]; 

} 

- (void)refreshRows { 
    // foreach row get status from webapp 
} 

EDIT:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    id <NSFetchedResultsSectionInfo> sectionInfo = 
    [[self.fetchedResultsController sections] objectAtIndex:section]; 
    return [sectionInfo numberOfObjects]; 
} 
+0

自動的にデータソースの更新のたびに、あなたのテーブルビューを更新します、あなたはあなたにnumberOfRowsInSectionを投稿することができます方法? insertRowsAtIndexPathsを使用してテーブルに項目を追加していますか?上記のエラーは、通常、モデルを更新せずにtableView挿入メソッドを呼び出すときに発生します。 – adamsiton

+0

それは起こっていることですが、ビューをリロードせずにモデルをリロードする方法がありますか? – nflacco

答えて

4

あなただけのデータソースが変更(とそのポイントを観測する必要があります)を知っている場合は、この方法を実行しよう可能性があります

ここで要求されたコードは次のとおりです。

  1. DataSourceアップデートの通知センターを観察するためにTableViewを登録してください。
  2. datasourceからの更新がNSNotificationCenterにポストされました。
  3. [self.tableView reloadData]を使用してTableViewの更新に対応します。表ビューコントローラで

    - (void) dataSourceChanged 
    { 
    
        // All instances of TestClass will be notified 
        [[NSNotificationCenter defaultCenter] 
         postNotificationName:@"myUniqueDataSourceChanged" 
         object:self]; 
    
    } 
    

    :データソースで

- (void)viewDidAppear:(BOOL)animated // new 
{ 
    NSLog(@"viewDidAppear"); 
    [super viewDidAppear:animated]; 

    [self.tableView reloadData]; // <------------- Prettier way to do this? 
    [self refreshRows]; 
    [[NSNotificationCenter defaultCenter] addObserver:self 
     selector:@selector(receiveNotification:) 
     name:@"myUniqueDataSourceChanged" 
     object:self.dataSource]; 
} 

- (void) receiveNotification:(NSNotification *) notification 
{ 
    if ([[notification name] isEqualToString:@"myUniqueDataSourceChanged"]) 
     [self dataSourceHasBeenChanged]; 
} 

- (void) dataSourceHasBeenChanged 
{ 

    [self.tableView reloadData]; 
    [self refreshRows]; 
} 

これは

関連する問題