Код обновлен до рабочей версии. Еще раз спасибо за помощь:)
Привет, ребята. У меня есть UITableViewController, настроенный для использования пользовательской ячейки, загруженной из пера. Вот мой cellForRowAtIndexPath:
// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
NSString *cellIdentifier = @"PeopleFilterTableViewCell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
if (cell == nil) {
[[NSBundle mainBundle] loadNibNamed:@"PeopleFilterTableViewCell" owner:self options:nil];
cell = peopleFilterTableViewCell;
self.peopleFilterTableViewCell = nil;
}
cell.selectionStyle = UITableViewCellSelectionStyleNone;
PeopleFilterTableViewCell* tableViewCell = (PeopleFilterTableViewCell *) cell;
/* Set direct button name */
Person* personAtRow = [directsToShow objectAtIndex:indexPath.row];
[tableViewCell.directButton setTitle:personAtRow.name forState:UIControlStateNormal];
/* Set direct head count */
tableViewCell.headcountLabel.text = [NSString stringWithFormat:@"%d", personAtRow.totalHeadCount];
UIImage* unselectedImage = [UIImage imageNamed:@"filterButton.png"];
UIImage* selectedImage = [UIImage imageNamed:@"filterButtonClosed.png"];
UIButton* newFilterButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
/* Set filter button image */
if(personAtRow.filtered){
[newFilterButton setSelected:YES];
} else {
[newFilterButton setSelected:NO];
}
tableViewCell.filterButton = newFilterButton;
return cell;
}
Мне кажется, что это нормально работает, но одна проблема возникла с кодом после / * установить изображение кнопки фильтра * / comment.
Кнопка фильтра - это UIB-кнопка в моем настраиваемом кончике ячейки, которая должна отражать состояние массива модели, содержащего объекты «Персона», у которых есть поле, которое можно переключать для представления того, фильтруются они или нет.
Я разрешаю пользователю обновлять этот объект модели с помощью специального метода делегата на моем контроллере верхнего уровня, который всякий раз, когда пользователь нажимает кнопку фильтра, обновляет модель и состояние кнопки, а также обновляет дополнительно. mapViewController с некоторыми данными для отображения в зависимости от состояния модели:
- (void)updateViews:(id)sender {
UIImage* unselectedImage = [UIImage imageNamed:@"filterButton.png"];
UIImage* selectedImage = [UIImage imageNamed:@"filterButtonClosed.png"];
int row = [self rowOfCellSubView:sender];
Person* personToFilter = [self.directsToBeShown objectAtIndex:row];
NSLog(@"Filtering person with corpId: %@, name: %@", personToFilter.corpId, personToFilter.name);
if (personToFilter.filtered){
//update button image
[sender setImage:unselectedImage forState:UIControlStateNormal];
[sender setSelected:NO];
//add person back.
Person* directFiltered = [self.directsToBeShown objectAtIndex:row];
directFiltered.filtered = NO;
NSLog(@"Filtering person with corpId: %@, name: %@, filtered: %d", directFiltered.corpId, directFiltered.name, directFiltered.filtered);
} else {
//update button image
[sender setImage:selectedImage forState:UIControlStateSelected];
[sender setSelected:YES];
//remove person.
personToFilter.filtered = YES;
NSLog(@"Filtering person with corpId: %@, name: %@, filtered: %d", personToFilter.corpId, personToFilter.name, personToFilter.filtered);
}
[self updateSitesToShow];
[self.mapViewController performSelectorOnMainThread:@selector(updateDisplay) withObject:nil waitUntilDone:NO];
}
Моя проблема связана с обновлением состояния кнопки фильтра. Когда мое приложение загружает просмотр таблицы, все выглядит нормально. Когда я нажимаю кнопку фильтра в определенной строке ячейки, состояние кнопки обновляется правильно, и объекты моей модели также обновляются правильно, так как я вижу ожидаемое поведение из mapView, который я в конечном итоге обновляю.
Однако проблема в том, что когда я нажимаю кнопку filterButton в одной строке ячейки, а затем прокручиваю несколько строк вниз, я замечаю, что другая кнопка фильтра в другой ячейке теперь имеет то же состояние, что и кнопка, которую я щелкнула несколькими строками выше , Если я снова прокручиваю вверх, исходная кнопка, которую я нажал «вкл», теперь кажется «выключенной», но строка под ней теперь отображается «вкл. Конечно, все это влияет на фактическое отображение кнопок. Фактическое состояние кнопок соответствует и работает правильно.
Я знаю, что эта проблема должна быть связана с тем фактом, что мои ячейки используются повторно, и я предполагаю, что как-то одинаковые кнопки используются для разных строк ячеек. Я в растерянности относительно того, как это происходит, так как я создаю новую кнопку фильтра для каждой ячейки, независимо от того, используется ли ячейка повторно или нет, и сбрасываю свойство filterButton ячейки, чтобы оно было вновь созданным объектом. Например, обратите внимание, что текст свойства headCount, который является UILabel, также определенным в кончике ячейки, также переназначается новому объекту String для каждой ячейки и отображается правильно для каждой строки.
Я боролся с этой проблемой уже несколько дней. Буду очень признателен за любую помощь или предложения.