2011-10-11 255 views
2

我有一個UITableView,其中包含一系列項目,每次通過方法refreshRows加載表時,我都會從Web應用程序獲取其狀態。我這樣做後,我重新加載表。重新加載UITableView數據而不重新加載視圖?

當我添加一個項目到我的表中時,我發現自己收到一條消息「無效更新:節中的行數無效」。重新加載表格中的數據變得有必要,所以我將舊方法更改爲新的方法(下面顯示了這兩種方法)。我現在有兩個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 
} 

編輯:

這裏的請求的代碼:

- (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. 註冊您的TableView以觀察數據源更新的通知中心。
  2. 將來自數據源的通知發佈到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]; 
} 

這將更新數據源的每次更新你的表視圖自動