2010-03-16 2 views
0

У меня есть UITableView, в котором некоторые ячейки отмечены с помощью UITableViewCellAccessoryCheckmark при инициализации представления.UITableViewCell: как проверить тип accessoriesType во всех ячейках?

Когда пользователь выбирает другую строку, я должен проверить, было ли достигнуто максимальное количество выбранных строк. Для этого я использовал код ниже:

- (NSInteger)tableView:(UITableView *)tableView numberOfSelectedRowsInSection:(NSInteger)section{ 

NSInteger numberOfRows   = [self tableView:tableView numberOfRowsInSection:section]; 
NSInteger numberOfSelectedRows = 0; 

for (int i = 0; i < numberOfRows; i++) { 

    UITableViewCell *otherCell = [tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:i inSection:section]]; 

    if (otherCell.accessoryType == UITableViewCellAccessoryCheckmark) { 
    numberOfSelectedRows++; 
    } 
} 

return numberOfSelectedRows; 

} 

Если мое число строк, как в примере 20, переменная numberOfRows правильно выставиться с 20. Допустим, что 13 строк уже отмечены UITableViewCellAccessoryCheckmark. Таким образом, numberOfSelectedRows должно быть 13 после цикла, но рассматриваются только отмеченные и VISIBLE. Итак, если у меня есть 9 ячеек и 7 отмечены, числоOfSelectedRows возвращает 7 вместо 13 (но для итерации 20 раз, как и ожидалось).

Правильно ли это поведение UITableView или это ошибка симулятора iPhone?

Заранее спасибо.

ответ

1

Это правильное поведение. UITableView не является . Система кэширует ячейку, которая отключена от экрана, чтобы сохранить память и процессор, и они не могут быть повторены таким образом, который имеет смысл.

Хорошо, вы должны отслеживать модель/данные, и tableView будет отслеживать ее отображение. У меня были некоторые проблемы с этим, пока я не принял, что uitableView не является списком :)

Итак, у вас есть массив объектов, каждый из которых соответствует данным в ячейке. При создании отдельных клеток, как это:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

    static NSString *CellIdentifier = @"categoryCell"; 

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

    Item *item = [self.itemList objectAtIndex:indexPath.row]; 

    [cell.textLabel setText:[item itemBrand]]; //notice that here we set the cell values 

    return cell; 
} 

WHEN, нажмет пользователь изменить вы модель, как это:

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

    NSLog(@"IndexPat.row%i", indexPath.row); 
    Item item = (Item*) [self.itemList objectAtIndex:indexPath.row]; 
    //change the state of item 
} 

Таким образом Tableview обновит походить на модели/данные, вам только что удалось модель.

2

Да, он работает как разработанный. Вы никогда не должны хранить данные модели в своих представлениях. UITableView ничего не знает о данных, он отображает только ячейки (и выдает их, как только они прокручиваются с экрана). Вам нужно сохранить состояние галочки в каждой ячейке в объекте модели (например, в массиве), доступ к которому вы можете получить с вашего контроллера вида.

Смежные вопросы