2012-08-04 80 views
0

所以我得到它通常不贊成修改的cellForRowAtIndexPath外的小區,但這裏是我:修改靜態細胞外的cellForRowAtIndexPath而無需創建新的細胞

我有一個作爲索引靜態表的問題(1-33)。每一行都有一個問題和一個詳細的披露指標。所有這些都是手動輸入到平板上。

我有一個文件,列出每個問題和一些屬性,如問題已被回答。
當這個屏幕加載(viewDidAppear)我想檢查是否每個這些問題都已經加載,如果是的話,將細節指標切換到複選標記。

現在這適用於前5個細胞。如果我回答問題並回來,那麼會檢查更多單元格(即使這些問題尚未得到解答)。這是未定義的行爲,因爲我在cellForRowAtIndexPath之外訪問它嗎?

這裏是我用來訪問和更改單元格中的代碼:

-(void) viewDidAppear:(BOOL)animated 
{ 
    [super viewDidAppear:animated]; 

    if (question1Answered) 
    { 
     UITableViewCell *cell1 = [self.tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:3]]; 
     [cell1 setAccessoryType:UITableViewCellAccessoryCheckmark]; 
    } 
} 

再次,它的工作的第5個元素,那麼剩下的就不會不管我做什麼改變。然後,如果我去問一個問題,並返回它顯示更多的選擇。奇怪的行爲...

編輯:我只注意到上述代碼的作品,但它只更新當前在屏幕上的單元格。所以如果我向下滾動,離開並回來,所有可見的單元格都會有複選標記。是否有強制刷新所有單元格的方法,即使它們不可見?

感謝您的任何和所有幫助...

-David

回答

0

這與我前幾天回答的另一個問題類似。請參閱stackoverflow.com/a/11770387/1479411

使用委託方法。從其他視圖控制器返回後,將任何修改單元格內容的代碼和[self.tableView reloadData]放入委託方法中。

0

你不應該從viewDidAppear更新單元。

相反,您應該從viewDidApeear重新加載數據。

-(void) viewDidAppear:(BOOL)animated 
{ 
    [super viewDidAppear:animated]; 

    if (question1Answered) 
    {    
     //This will call your tableview's delegate for visible cells 
     [self.tableView reloadData]; 
    } 
} 

而在cellForRowAtIndexPath中,您應該決定分配附件類型。

0

U應首先更新您的模型,然後根據模型狀態更新您的UI。
例如,如果您的模型是一個Question對象的數組,並且每個問題都有一些hasBeenAnswered布爾值。
然後唯一的事情你應該做的viewDidAppear是要打[self.tableView reloadData],這將更新您的表格視圖,因爲cellForRowAtIndexPath將被調用,並根據您的模型狀態設置單元格。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *CellIdentifier = @"CellIdentifier"; 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

    if(cell == nil) { 
     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 
    } 

    // configure the cell according to your model state 
    Question *question = [self.questions objectAtIndex:indexPath.row]; 

    // check if this question has been answered 
    if (question.hasBeenAnswered) { 
     // if yes - set a checkmark 
     [cell setAccessoryType:UITableViewCellAccessoryCheckmark]; 
    } 
    else { 
     // if not - set to none (or whatever u want) 
     [cell setAccessoryType:UITableViewCellAccessoryNone]; 
    } 

    return cell; 
}