UITableView выбирает ячейки путем прокрутки вверх и вниз - PullRequest
1 голос
/ 08 августа 2011

У меня в приложении для 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 голосов
/ 08 августа 2011

Вам нужно ELSE после проверки prefs valueForKey.Вам необходимо очистить accessoryType в этом ELSE.

То, что вы видите, это поведение UITableView по умолчанию.Клетки кэшируются и воссоздаются только при необходимости.Вот что делает верхний бит с dequeueReusableCell.

Итак, поскольку у вас нет кода, который когда-либо очищает accessoryType, в конечном итоге все они в конечном итоге проверяются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...