Ячейка UITableView, отображающая неправильный контент после изменения высоты
Я работаю над реализацией UITableView с тремя разделами. В последней строке второго раздела должен отображаться экземпляр UIPicker.
Таким образом, я изменил высоту для этой конкретной строки, как показано ниже:
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
CGFloat rowHeight = self.tableView.rowHeight;
if (indexPath.section == RedZoneSection && indexPath.row == MonitorConfigRow){
rowHeight = 162;
return rowHeight;
}
return rowHeight;
}
Однако, когда я добавляю этот код, первая строка ("Только оповещение из") в третьем разделе добавляет UISwitch к своему представлению, которого там быть не должно, как показано ниже:
Ниже я реализую cellForRowAtIndexPath
для третьего раздела:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForTimeOfDayRestrictionsRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"SettingsRowCell";
UITableViewCell *cell = (UITableViewCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier];
}
cell.backgroundColor = [UIColor colorWithRed:0.922 green:0.937 blue:0.949 alpha:1];
switch (indexPath.row) {
case HourTimeZoneRow:
cell.textLabel.text = NSLocalizedString(@"Only Alert From", @"Only Alert Row");
break;
default:
break;
}
return cell;
}
РЕДАКТИРОВАТЬ Конкретный переключатель UIS, который снова отображается в неправильном месте, изначально находится во второй ячейке первого раздела моей таблицы. Ниже приведена реализация cellForRowAtIndexPath
для этого раздела:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForSubscribedNotificationsRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"SettingsRowCell";
UITableViewCell *cell = (UITableViewCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier];
}
cell.backgroundColor = [UIColor colorWithRed:0.922 green:0.937 blue:0.949 alpha:1];
UISwitch *cellSwitch = nil;
switch (indexPath.row) {
case RowOne:
cell.textLabel.text = NSLocalizedString(@"Row One", @"Row One");
cellSwitch = [[UISwitch alloc] init];
cell.accessoryView = cellSwitch;
break;
case RowTwo:
cell.textLabel.text = NSLocalizedString(@"Row Two", @"Row Two");
cell.accessoryView = cellSwitch;
break;
// cell.textLabel.text = nil ;
cell.accessoryView = UITableViewCellAccessoryNone;
accessoryViewIsShowing = FALSE;
break;
}
if (cell.accessoryView == nil) {
NSLog(@"Cell accessoryView is nil");
}
else if (cell.accessoryView != nil){
NSLog(@"Cell accessoryView is not nil");
}
NSLog(@"Section: %ld, Row: %ld", (long)indexPath.section, (long)indexPath.row);
return cell;
}
Кто-нибудь знает, почему изменение высоты определенной ячейки приводит к тому, что некорректное содержимое отображается в ячейке в другом разделе?
1 ответ
Проблема есть из-за ошибки, связанной с переработкой ячеек в tableView:cellForSubscribedNotificationsRowAtIndexPath:
метод. Изменение высоты одной из ячеек делает эту ошибку видимой.
Вам нужно добавить код в default
чехол для удаления аксессуаров и текста ячейки, который вы добавляете для RowOne
а также RowTwo
:
default:
cell.textLabel.text = nil;
cell.accessoryView = nil;
break;
В противном случае "переработанная" ячейка в строках, отличных от RowOne
а также RowTwo
, который раньше был RowOne
или же RowTwo
, будет содержать старый текст и дополнительное представление, которое было там до того, как ячейка была переработана.
Другой альтернативой для решения этой проблемы будет переопределениеprepareForReuse
,