UITableViewCell: как проверить тип accessoryType во всех ячейках? - PullRequest
0 голосов
/ 17 марта 2010

У меня есть UITableView, в котором некоторые ячейки помечены UITableViewCellAccessoryCheckmark при инициализации представления.

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

- (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 помечены, numberOfSelectedRows возвращает 7 вместо 13 (но для итерации 20 раз, как и ожидалось).

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

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

Ответы [ 2 ]

2 голосов
/ 17 марта 2010

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

1 голос
/ 17 марта 2010

Это правильное поведение.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;
}

Когда пользователь щелкает, вы меняете свою модель следующим образом:

- (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 будет обновляться в соответствии с моделью / данными.Вы только что управляли моделью.

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