Проблема с настройкой UITableView как включающего списка выбора - PullRequest
0 голосов
/ 01 декабря 2010

Я программирую UITableView, чтобы он вел себя как включающий список выбора.Моя таблица отображается правильно и позволяет выбрать несколько ячеек с флажками.Моя проблема в том, что выбранные ячейки (ячейки содержат флажок справа) теряют свой выбранный статус при прокрутке вне поля зрения (флажок ячейки исчезает).Я хочу, чтобы выборки, сделанные для ячеек таблицы, сохранялись, даже если ячейки прокручиваются вне поля зрения.У кого-нибудь есть идеи, что вызывает это?

Вот мой код внутри моего класса TableViewController:

- (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];
}

NSUInteger row = [indexPath row];
cell.textLabel.text = [widgetTitles_glob objectAtIndex:row];
cell.detailTextLabel.text = @"";
cell.textLabel.textColor = [UIColor blackColor]; 
cell.textLabel.font = [UIFont boldSystemFontOfSize:15];
cell.accessoryType = UITableViewCellAccessoryNone; 
return cell;

}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
[tableView deselectRowAtIndexPath:[tableView indexPathForSelectedRow] animated:YES];
UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
if (cell.accessoryType == UITableViewCellAccessoryNone) {
    cell.accessoryType = UITableViewCellAccessoryCheckmark;
    // Reflect selection in data model
} else if (cell.accessoryType == UITableViewCellAccessoryCheckmark) {
    cell.accessoryType = UITableViewCellAccessoryNone;
    // Reflect deselection in data model
}

}

Любая помощь будет очень признательна.

Ответы [ 3 ]

1 голос
/ 01 декабря 2010

При правильном использовании UITableView выделяется только столько экземпляров UITableViewCell, сколько необходимо для размещения на экране. Когда вы прокручиваете таблицу вниз, и ячейка исчезает из верхней части экрана, она перемещается в нижнюю часть.

Ваш метод делегата tableView:cellForRowAtIndexPath: отвечает за настройку ячейки, либо за создание новой, либо за перенастройку переработанной ячейки .

Надо использовать массив для хранения проверенных / непроверенных значений. Когда вызывается didSelectRowAtIndexPath:, вы обновляете ячейку и ваш массив. Когда вызывается tableView:cellForRowAtIndexPath:, вы настраиваете ячейку на основе значений в массиве.

Судя по вашим комментариям, вы уже поступаете правильно в didSelectRowAtIndexPath:; вам просто нужно использовать эти значения при настройке экземпляра ячейки, потому что эта ячейка может представлять строку, которая уже была проверена. Проверьте массив и затем установите cell.accessoryType соответственно.

0 голосов
/ 01 декабря 2010

Спасибо за вашу помощь.Фактически получается, что причиной сброса ячеек в UITableViewCellAccessoryNone была следующая строка кода в cellForRowAtindexPath:

cell.accessoryType = UITableViewCellAccessoryNone; 

Удаление этого исправило таблицу

0 голосов
/ 01 декабря 2010

В cellForRowAtIndexPath: вы назначали accessoryType как none, поэтому всякий раз, когда вы прокручиваете этот делегат, вызывается и задаете тип аксессуара как none.Поэтому вы должны изменить свой код.

Я тоже однажды сталкивался с этой проблемой;Я пришел к следующему решению:

Сохраните значения indexPath.row выбранного indexPath в массиве (этот код должен быть в делегате didSelectRowAtIndexPath), если он отменен, удалите из этого массива.В cellForRowAtIndexPath: метод, который я использовал для цикла for и проверьте, присутствует ли этот indexPath.row, затем измените его тип аксессуара на галочку, иначе none.

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