0

Я работаю над реализацией UITableView с тремя разделами. Последняя строка второго раздела должна отображать экземпляр UIPicker.UITableView ячейка, отображающая неправильное содержимое после изменения высоты

Как таковой, я изменил высоту для этой конкретной строки, как показано ниже:

- (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 это мнение, которое не должно быть, как показано ниже:

enter image description here

ниже, где я осуществить 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; 
} 

EDIT Конкретный UISwitch, который отображается снова в неправильном месте, первоначально находится во второй ячейке в первом разделе моей таблицы. Ниже приводится реализация 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; 
} 

Кто-нибудь знает, почему изменения высоты конкретной ячейки с причиной неправильного содержания, которое будет отображаться в ячейке в другом разделе?

+0

Я не могу найти ту часть, где вы добавляете 'UISwitch' программно в ячейки таблицы. Есть ли дополнительный код в вашей 'cellForTimeOfDayRestrictionsRowAtIndexPath:', который вы не показывали, чтобы сократить пример? – dasblinkenlight

+0

HI @dasblinkenlight, Да, я боялся, что вопрос слишком длинный. Я только что отредактировал его, чтобы включить туда, где «UISwitch» добавляется в ячейки в первой строке. Спасибо! – narner

+0

Вы перерабатываете ячейку и не можете удалить переключатель из старой ячейки. –

ответ

2

Проблема возникает из-за ошибки, связанной с переработкой ячеек в методе tableView:cellForSubscribedNotificationsRowAtIndexPath:. Изменение высоты одной из ячеек делает эту ошибку видимой.

Вам нужно добавить код в default случае удалить аксессуары и текст ячейки, добавляемые для RowOne и RowTwo:

default: 
    cell.textLabel.text = nil; 
    cell.accessoryView = nil; 
    break; 

В противном случае, «перераспределить» клеток в других рядах, чем RowOne и RowTwo, которые используется как RowOne или RowTwo, будет содержать старый текст и аксессуар, который был там до того, как ячейка была переработана.

Другой альтернативой решению этого вопроса будет overriding prepareForReuse.

+0

Это рассуждение имеет смысл. Однако я попробовал ваше предложение; Я все еще получаю то же самое поведение:/ – narner

+1

@narner Это странно - в логике метода есть что-то еще, в котором хранится старый вид аксессуаров. Я бы добавил вызов NSLog', прежде чем возвращать ячейку, чтобы увидеть две вещи: номер строки и true/false, указывающий, является ли вид аксессуара ячейки «nil». – dasblinkenlight

+0

Я попробовал это и получил следующий результат: Раздел: 0, строка: 0, вид аксессуара отображается, раздел: 0, строка: 1, вид аксессуаров не отображается, раздел: 0, строка: 0, вид аксессуаров не показано, Раздел: 0, строка: 1, вид аксессуаров не отображается – narner

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