Ну, это случайно, потому что вы, вероятно, еще не до конца поняли, как работает UITableView.
Он использует ячейки, поэтому вы вызываете метод dequeTableCellWithIdentifier:
для UITableView
. Это означает, что он будет использовать одну из ячеек, которые больше не отображаются.
Не добавляйте UITableViewCell
для каждого элемента в UITableViewDataSource
, это может / будет использовать слишком много памяти, а ваш UITabelView
будет чувствовать себя очень медленно.
Просто убедитесь, что источник данных содержит все данные, необходимые для объекта, а не UITableViewCell
. Значение заголовка, выбранные состояния, ...
Что вам нужно сделать, это установить выбранное состояние ячейки в элементе UITableViewDataSource
и найти выбранное значение, указанное в UITableViewDataSource
, а не UITableViewCell
.
Таким образом, в объект, который вы извлекаете из JSON, добавьте выбранное свойство, которое принимает BOOL.
Затем в UITableViewDataSoutrce
методе cellForRowAtIndexPath
сделать что-то вроде:
- (UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *cellIdentifier = @"SomeCellIdentiefier";
UITableViewCell *cell = (SongTableViewCell *)[tableView dequeueReusableCellWithIdentifier:cellIdentifier];
if (!cell) {
//Load new cell
}
YouJSONObject *item = [self.array objectAtIndex:indexPath.row];
if (item.selecte) {
cell.accessoryType = UITableViewCellAccessoryCheckmark;
} else {
cell.accessoryType = UITableViewCellAccessoryNone;
}
}
Тогда ваши UITableViewDelegate
методы didSelectRowAtIndexPath
делают что-то вроде:
- (void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
YouJSONObject *item = [self.array objectAtIndex:indexPath.row];
item.selected = !item.selected;
if (item.selecte) {
cell.accessoryType = UITableViewCellAccessoryCheckmark;
} else {
cell.accessoryType = UITableViewCellAccessoryNone;
}
}