2011-04-15 147 views
3

我有一个tableview,其中包含用户可以“挑选”的声音列表。只有当前选择的声音应显示UITableViewCellAccessoryCheckmark。基本上我得到它的工作。但是,例如,检查底部单元格,然后向上滚动表格视图(使选中的单元格离开视图),然后检查另一个单元格,底部(视图外)的单元格不会被删除。有人知道为什么吗?一次只允许有一个UITableViewCellAccessoryCheckmark

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



    // Configure the cell... 

    NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; 
    NSString *theSound = [prefs objectForKey:@"pickedFailSound"]; 
    NSUInteger index = [failSounds indexOfObject:theSound]; 


    if (indexPath.section == 0){ 

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


     failAtLaunch = [[[UISwitch alloc] initWithFrame:CGRectMake(200, 7, 100, 30)] autorelease]; 
     [cell addSubview:failAtLaunch]; 
     cell.accessoryView = failAtLaunch; 
     cell.selectionStyle = UITableViewCellSelectionStyleNone; 

     NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; 

     if(![prefs boolForKey:@"failAtLaunch"]) { 
      [failAtLaunch setOn:NO animated:NO]; 
     } else { 
      [failAtLaunch setOn:YES animated:NO]; 
     } 

     [(UISwitch *)cell.accessoryView addTarget:self action:@selector(setIt) forControlEvents:UIControlEventValueChanged]; 
     cell.textLabel.text = @"Instafail"; 
     cell.detailTextLabel.text = @"Fail at Laucnh"; 

     return cell; 

    } else if (indexPath.section == 1) { 

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

     NSString *cellTitle = [failSounds objectAtIndex:indexPath.row]; 
     cell.textLabel.text = cellTitle; 

     if (indexPath.row == index) { 
      cell.accessoryType = UITableViewCellAccessoryCheckmark; 
     } 



     if ([cellTitle isEqualToString:@"Your Fail Sound"]){ 

      NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; 
      if(![prefs boolForKey:@"customSoundAvailable"]) { 

       cell.selectionStyle = UITableViewCellSelectionStyleNone; 
       cell.userInteractionEnabled = NO; 
       cell.textLabel.textColor = [UIColor grayColor]; 
       cell.detailTextLabel.text = @"Record a Custom Failsound First"; 
      } 
     } 

    return cell; 

    } else { 

     UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:TheOtherOne]; 
     if (cell == nil) { 
      cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:TheOtherOne] autorelease]; 
     } 


     cell.textLabel.text = @"Hold to record fail sound"; 
     UIButton *btn = [UIButton buttonWithType:UIButtonTypeRoundedRect]; 
     btn.frame = CGRectMake(230.0f, 4.0f, 60.0f, 36.0f); 
     [btn setTitle:@"OK" forState:UIControlStateNormal]; 
     [btn setTitle:@"OK" forState:UIControlStateSelected]; 
     [btn addTarget:self action:@selector(recordAudio) forControlEvents:UIControlEventTouchDown]; 
     [btn addTarget:self action:@selector(stop) forControlEvents:UIControlEventTouchUpInside]; 
     [cell.contentView addSubview:btn]; 


     return cell; 

     }  
    } 

和:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 


    [tableView deselectRowAtIndexPath:indexPath animated:YES]; 

    NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; 
    NSString *theSound = [prefs objectForKey:@"pickedFailSound"]; 
    NSUInteger index = [failSounds indexOfObject:theSound]; 

    //NSLog(@"The index is: %@", index); 

    if (indexPath.section == 1){ 


       NSIndexPath *oldIndexPath = [NSIndexPath indexPathForRow:index inSection:1]; 

       NSLog(@"Oldindexpath is: %@", oldIndexPath); 
       UITableViewCell *newCell = [tableView cellForRowAtIndexPath:indexPath]; 


       if (newCell.accessoryType == UITableViewCellAccessoryNone) { 

        newCell.accessoryType = UITableViewCellAccessoryCheckmark; 
       } 

       UITableViewCell *oldCell = [tableView cellForRowAtIndexPath:oldIndexPath]; 


       if (oldCell != newCell){ 

        if (oldCell.accessoryType == UITableViewCellAccessoryCheckmark) { 

         oldCell.accessoryType = UITableViewCellAccessoryNone; 
        } 
       } 



    NSString *pickedSound = [failSounds objectAtIndex:indexPath.row]; 
    NSLog(@"Picked sound is %@", pickedSound); 
    [prefs setObject:pickedSound forKey:@"pickedFailSound"]; 
    [prefs synchronize];   

    [self performSelector:@selector(loadSound) withObject:nil]; 
    [failSound play]; 



    } 

} 

回答

4

你没记重设离队细胞的附件类型。

这应该为您解决它;

cell.accessoryType = UITableViewCellAccessoryNone; 

    if (indexPath.row == index) { 
      cell.accessoryType = UITableViewCellAccessoryCheckmark; 
    } 

方便的技巧:你可能会发现,使用开关(indexPath.section),而不是很多,如果... ... ELSEIF其他构造。虽然你现在只用了2个部分,但我发现使用switch可以更容易地扩展部分的数量,并且使得通过代码阅读更容易,因为你经常有if .. else构造用于其他事情 - 具有不同的语法有助于使测试更清晰。

+0

我同意,usinga开关stament是非常有用的,更易于读取,这种情况下。 – Sabobin 2011-04-15 13:33:22

+0

太棒了。非常感谢 – 2011-04-15 13:36:05

1

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPathcell每个声明尝试正在重置通过添加以下行accessoryType细胞:cell.accessoryType = UITableViewCellAccessoryNone;