2010-12-15 53 views
1

我正在寫一個包含2個部分的UITableView。當表第一次加載所有單元格顯示正確的信息時,但是當我開始向上和向下滾動時,單元格detailedTextLabel和accessoryType正在刷新不正確,因此一些只應包含detailedTextLabel的單元格也包含附件和單元格應該只包含一個附件還包含一個detailedTextLabel。UITableView在滾動時沒有正確更新

Inside cellForRowAtIndexPath:我正在使用嵌套的開關/ case語句將正確的值應用到其各自的節/行中的單元格。據我所知,這些陳述中的邏輯是正確的,那麼在更新時,cell變量的值是否可能會降低呢?

該表正確加載,但在滾動accessoryType和detailedTextLabel後混淆起來。

Click for link to screen shots of the table.

這裏是我的UITableViewController子類中的代碼:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { 
    return [sectionNames count]; 
} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 
    // Return the number of rows in the section. 
    NSArray *headingsSection = [cellTitles objectAtIndex:section]; 
    return [headingsSection count]; 
} 

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section { 
    return [sectionNames objectAtIndex:section]; 
} 

// Customize the appearance of table view cells. 
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

    self.tableView.allowsSelection = YES; 
    static NSString *CellIdentifier = @"Cell"; 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier] autorelease]; 
    } 

    cell.textLabel.text = [[cellTitles objectAtIndex:indexPath.section] objectAtIndex:indexPath.row]; 
    cell.textLabel.textColor = [UIColor blackColor]; 
    cell.textLabel.font = [UIFont boldSystemFontOfSize:15]; 

    switch (indexPath.section) { 
    case 0: 
     cell.detailTextLabel.text = [NSString stringWithFormat:@"%d%%", [[assistSettingsArray_glob objectAtIndex:indexPath.row] intValue]]; 
     break; 
    case 1: 
     switch (indexPath.row) { 
     case 0: 
      cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; 
      break; 
     case 1: 
      cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; 
      break; 
     case 2: 
      if (defaultAssistOn) { 
       cell.accessoryType = UITableViewCellAccessoryCheckmark; 
      } else { 
       cell.accessoryType = UITableViewCellAccessoryNone; 
      } 
      break; 
     } 
     break; 
    } 

    return cell; 
} 

回答

8

由於電池再利用,與預先設定的值的單元格重新出現。

switch (indexPath.section) ...之前,初始化detailTextLabel和accessoryType爲默認值:

cell.detailTextLabel.text = @""; 
cell.accessoryType = UITableViewCellAccessoryNone; 
+1

此外,如果您決定添加子視圖到內容視圖,您需要刪除那些像'[[[contentView]子視圖] makeObjectsPerformSelector:@selector(removeFromSuperview)];'' – Winder 2010-12-15 13:39:05

+0

哦,太棒了,這已經完美地解決了這個問題。非常感謝。 :) – Sabobin 2010-12-15 13:54:32

0

嘗試括在每個開關內部parantheisis例的代碼。所以上面的代碼看起來像這樣:

switch (indexPath.section) { 
    case 0: { 
     cell.detailTextLabel.text = [NSString stringWithFormat:@"%d%%", 
       [[assistSettingsArray_glob objectAtIndex:indexPath.row] intValue]]; 
     break; 
    } 
    case 1: { 
     switch (indexPath.row) { 
      case 0: { 
       cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; 
       break; } 
     case 1: { 
      cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; 
      break; } 
     case 2: { 
      if (defaultAssistOn) { 
       cell.accessoryType = UITableViewCellAccessoryCheckmark; 
      } 
      else{ 
       cell.accessoryType = UITableViewCellAccessoryNone; 
      } 
      break; } 
     default: 
      break; 
     } 
     break; 
    } 
    default: 
    break; 
    } 

我不確定這是否工作。請告知它是否:)

+0

以前的答案實際上解決了這個問題。謝謝你的幫助。 – Sabobin 2010-12-15 13:55:16