UITableView通过向上和向下滚动来选择单元格

时间:2011-08-08 02:00:46

标签: uitableview nsuserdefaults

我的iPhone应用程序中有一个分组表视图,其中包含一天中所有24小时的列表。当用户选择表视图中的一个单元格时,它会在其附件视图中显示一个复选标记,并通过NSUserDefaults保存数据。当用户加载视图时,这意味着我必须从NSUserDefaults中提取信息并在相应的单元格上显示复选标记。这工作正常,直到我开始在视图中滚动。然后发生这种情况:

enter image description here

我已设置didSelectRowAtIndexPath,以便在选择一行时取消选择所有其他行。这很好用,但只需滚动列表,就会开始选择看似随机的项目。如果我继续向上和向下滚动几次,则会选择所有项目。如果我单击其中一个单元格,则选择一个单元格而取消选择其他单元格(这应该是这样)。

但是为什么只通过滚动选择单元格呢?这是我的cellForRowAtIndexPath方法,问题可能位于:

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

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

    NSString *cellValue;

    if (indexPath.row == 0) {
        cellValue = @"00:00";
    } else if (indexPath.row == 1) {
        cellValue = @"01:00";
    } else if (indexPath.row == 2) {
        cellValue = @"02:00";
    } else if (indexPath.row == 3) {
        cellValue = @"03:00";
    } else if (indexPath.row == 4) {
        cellValue = @"04:00";
    } else if (indexPath.row == 5) {
        cellValue = @"05:00";
    } else if (indexPath.row == 6) {
        cellValue = @"06:00";
    } else if (indexPath.row == 7) {
        cellValue = @"07:00";
    } else if (indexPath.row == 8) {
        cellValue = @"08:00";
    } else if (indexPath.row == 9) {
        cellValue = @"09:00";
    } else if (indexPath.row == 10) {
        cellValue = @"10:00";
    } else if (indexPath.row == 11) {
        cellValue = @"11:00";
    } else if (indexPath.row == 12) {
        cellValue = @"12:00";
    } else if (indexPath.row == 13) {
        cellValue = @"13:00";
    } else if (indexPath.row == 14) {
        cellValue = @"14:00";
    } else if (indexPath.row == 15) {
        cellValue = @"15:00";
    } else if (indexPath.row == 16) {
        cellValue = @"16:00";
    } else if (indexPath.row == 17) {
        cellValue = @"17:00";
    } else if (indexPath.row == 18) {
        cellValue = @"18:00";
    } else if (indexPath.row == 19) {
        cellValue = @"19:00";
    } else if (indexPath.row == 20) {
        cellValue = @"20:00";
    } else if (indexPath.row == 21) {
        cellValue = @"21:00";
    } else if (indexPath.row == 22) {
        cellValue = @"22:00";
    } else if (indexPath.row == 23) {
        cellValue = @"23:00";
    }

    if ([[prefs valueForKey:@"quiet_hours_time_interval_from"] isEqualToString:cellValue]) {
        cell.accessoryType = UITableViewCellAccessoryCheckmark;
        cell.textLabel.textColor = [UIColor colorWithRed:72.0 / 255 green:104.0 / 255 blue:152.0 / 255 alpha:1];
    }

    cell.textLabel.text = cellValue;

    return cell;
}

prefs等于[NSUserDefaults standardUserDefaults],我将(正确)选定的单元格的确切值保存到quiet_hours_time_interval_from键。

希望你们能帮忙。

1 个答案:

答案 0 :(得分:0)

检查prefs valueForKey后需要一个ELSE。您需要清除该ELSE中的accessoryType。

您看到的是UITableView的默认行为。单元格被缓存,只在需要时重新创建。这就是dequeueReusableCell顶部的位置。

因此,由于您没有任何清除accessoryType的代码,最终所有代码都会被检查。