2015-05-20 150 views
0

我有一個UITableView充滿了UITableViewCell,它包含一個複選標記。reloadRowsAtIndexPaths副作用?

enter image description here

當我點擊一個單元格,如果它被標記變得無人盯防,反之亦然。

enter image description here

到目前爲止好。現在我想每次點擊任何其他單元格時更新第一個單元格(假定第一個單元格是奇特的)。我修改了代碼didSelectRowAtIndexPath方法(見下文),它能夠正常工作,只是我上電池以下不希望的行爲,我點擊:

enter image description here

正如你所看到的頂部的白線細胞已經消失......

這裏是我的代碼看起來像的(我猜的)關鍵功能:

- (UITableViewCell *)tableView:(UITableView *)aTableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:@"cell" forIndexPath:indexPath]; 
    cell.selectionStyle = UITableViewCellSelectionStyleNone; 
    cell.backgroundColor = [UIColor darkGrayColor]; 
    cell.textLabel.textColor = [UIColor whiteColor]; 
    cell.textLabel.text = [myLabels objectAtIndex:indexPath.row]; 
    bool isChecked = false; 
    if ([currentValues[indexPath.row] boolValue]) { 
     isChecked = true; 
    } 
    cell.accessoryType = isChecked ? UITableViewCellAccessoryCheckmark : UITableViewCellAccessoryNone; 
    return cell; 
} 


- (void)tableView:(UITableView *)aTableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
    UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath]; 
    bool isChecked = false; 
    if ([currentValues[indexPath.row] boolValue]) { 
     isChecked = false; 
     currentValues[indexPath.row] = [NSInteger numberWithBool:false]; 

     // below is the part of code that causes trouble 

     [self.tableView beginUpdates]; 
     NSIndexPath* indexPath = [NSIndexPath indexPathForRow:0 inSection:0]; 
     [self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationNone]; 
     [self.tableView endUpdates]; 

     // end of problematic code 
    } 

    else { 
     isChecked = true; 
     currentValues[indexPath.row] = [NSInteger numberWithBool:true]; 
     // similarly... 
     [self.tableView beginUpdates]; 
     NSIndexPath* indexPath = [NSIndexPath indexPathForRow:0 inSection:0]; 
     [self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationNone]; 
     [self.tableView endUpdates]; 
    } 
    cell.accessoryType = isChecked ? UITableViewCellAccessoryCheckmark :UITableViewCellAccessoryNone; 
} 

NB如果我重新加載整個TA可是,我沒有這個問題。但我覺得這對我瞭解那裏發生的事情可能是值得的。

NB2我嘗試過和沒有[self.tableView beginUpdates]和[self.tableView endUpdates]的調用,但它似乎沒有什麼區別。

回答

0

didSelectRowAtIndexPath將有點像變去,

- (void)tableView:(UITableView *)aTableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
    UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath]; 
    bool isChecked = false; 
    if ([currentValues[indexPath.row] boolValue]) { 
     isChecked = false; 
     currentValues[indexPath.row] = [NSInteger numberWithBool:false]; 

     // below is the part of code that causes trouble 
     [self.tableView deselectRowAtIndexPath:indexPath animated:NO]; 
     //MYCHANGES 
     [self.tableView beginUpdates]; 
     NSIndexPath* indexPath = [NSIndexPath indexPathForRow:0 inSection:0]; 
     [self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationNone]; 
     [self.tableView endUpdates]; 

     // end of problematic code 
    } 

    else { 
     isChecked = true; 
     currentValues[indexPath.row] = [NSInteger numberWithBool:true]; 
     // similarly... 
     [self.tableView deselectRowAtIndexPath:indexPath animated:NO]; 
     //MYCHANGES 
     [self.tableView beginUpdates]; 
     NSIndexPath* indexPath = [NSIndexPath indexPathForRow:0 inSection:0]; 
     [self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationNone]; 
     [self.tableView endUpdates]; 
    } 
    cell.accessoryType = isChecked ? UITableViewCellAccessoryCheckmark :UITableViewCellAccessoryNone; 
} 
+0

意想不到的回答,非常感謝你!任何想法當你不取消選擇細胞時會發生什麼?爲什麼這會導致白線消失? – vib

+0

你可以說,這是蘋果的bug,我沒有太多想法,但是無論何時選擇一行/單元格,並且如果執行重新加載單元格,它都會刪除分隔符,直到重新加載完整的tableview,這不是合適的解決方案每次。 –