Индикатор отбеливания UITableView сходит с ума - PullRequest
0 голосов
/ 01 декабря 2011

У меня есть UITableView (на UIViewController), который проталкивается через навигационный контроллер. Наряду с нажатием, я выбираю, каким массивом я хочу заполнить таблицу. Код для толкания выглядит так:

if(self.newView == nil)
{
    NewView *viewTwo = [[NewView alloc] initWithNibName:@"Bundle" bundle:[NSBundle mainBundle]];
    self.newView = viewTwo;
    [viewTwo release];
}

[self.navigationController pushViewController:self.newView animated:YES];
newView.tableArray=newView.arrayWithOptionOne;
[newView.tableView reloadData];

Все работает хорошо, и таблица каждый раз перезагружается. Однако в последнем ряду секции 0 есть переключатель, который загружает секцию 1. Последняя строка раздела 1 является обновляемой (didSelect…) и загружает modalView. На этом последнем стержне я добавил индикатор раскрытия, а также синий фон при нажатии. В таблице есть ползунки, метки и т. Д. Поэтому настройки довольно длинные:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{

UITableViewCell *cell = nil;


static NSString *kDisplayCell_ID = @"DisplayCellID";

cell = [tableView dequeueReusableCellWithIdentifier:kDisplayCell_ID];

if (cell == nil)
    {
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue2 reuseIdentifier:kDisplayCell_ID] autorelease];
    cell.selectionStyle = UITableViewCellSelectionStyleNone;

    }
else
    {

    UIView *viewToRemove = nil;
    viewToRemove = [cell.contentView viewWithTag:1];
    if (viewToRemove)
        [viewToRemove removeFromSuperview];

    UIView *viewToRemove2 = nil;
    viewToRemove2 = [cell.contentView viewWithTag:2];
    if (viewToRemove2)
        [viewToRemove2 removeFromSuperview];


 }


    if (indexPath.section==0) {
        UIControl *cellValueS = [[[arrayTable objectAtIndex:indexPath.section] objectForKey:kViewKey] objectAtIndex:indexPath.row];
        [cell.contentView addSubview:cellValueS];
    }

    if (indexPath.section==0 && indexPath.row==3) {
        UIControl *cellValueL = [[[arrayTable objectAtIndex:indexPath.section] objectForKey:kViewLabel] objectAtIndex:0] ;
        [cell.contentView addSubview:cellValueL];
    }

    if (indexPath.section==1 && indexPath.row==0){
        UIControl *cellValueS = [[[arrayTable objectAtIndex:indexPath.section] objectForKey:kViewKey] objectAtIndex:indexPath.row] ;
        [cell.contentView addSubview:cellValueS];
    } 

    if (indexPath.section==1 && indexPath.row==1) {
        UIControl *cellValueS = [[[arrayTable objectAtIndex:indexPath.section] objectForKey:kViewKey] objectAtIndex:indexPath.row] ;
        [cell.contentView addSubview:cellValueS];

        UIControl *cellValueL = [[[arrayTable objectAtIndex:indexPath.section] objectForKey:kViewLabel] objectAtIndex:0] ;
        [cell.contentView addSubview:cellValueL];
    }

    if (indexPath.section==1 && indexPath.row==2) {
        cell.selectionStyle = UITableViewCellSelectionStyleBlue;
        cell.accessoryType=UITableViewCellAccessoryDisclosureIndicator;
    }

    return cell;
}

Пока тоже работает нормально.

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

Я пытался понять, почему это происходит, но я не могу. Я как-то решил эту проблему, установив newView в nil и выпустив его, а затем снова выделив его, прежде чем он снова будет выдвинут.

Я что-то здесь не так делаю? или почему индикатор раскрытия информации и фон касания появляются там, где их не должно быть?

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

Действие выключателя

-(void)extraOptionsSwitchAction:(id)sender{



 switch(extraOptionsSwitch.isOn) {

 case 1:

 // [self.tableView beginUpdates];
 [self.tableView insertSections: [NSIndexSet indexSetWithIndex:1]  withRowAnimation:UITableViewRowAnimationAutomatic];
 [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationAutomatic];

 //[self.tableView reloadData];
 //  [self.tableView endUpdates];

 break;

 case !1:

 //   [self.tableView beginUpdates];
 [self.tableView deleteSections: [NSIndexSet indexSetWithIndex:1]  withRowAnimation:UITableViewRowAnimationAutomatic];
 // [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationAutomatic];

 [self.tableView reloadData];
 // [self.tableView endUpdates];

 break;

 }
 }

Ответы [ 2 ]

2 голосов
/ 01 декабря 2011

Это связано с повторным использованием ячеек.Вы, вероятно, не различаете разные типы ячеек в своем методе создания ячеек, поэтому одну ячейку, которая ушла за пределы экрана, можно легко использовать для другой (другого типа) ячейки.Кроме того, вы, кажется, добавляете подпредставления снова и снова - делайте это только при создании экземпляра ячейки (с помощью alloc / int), а не при настройке.

Кроме того, для разных типов ячеек используйте разные идентификаторы (выне показывал этот код).

В руководствах по программированию есть хороший пример табличных представлений, их ячеек и шаблона повторного использования.Стоит прочитать пару раз - легко ошибиться и является основной темой для настройки производительности.

Edit

Теперь, когда вы добавили больше кода, другая проблемаКажется, здесь:

if (indexPath.section==1 && indexPath.row==2) {
    cell.selectionStyle = UITableViewCellSelectionStyleBlue;
    cell.accessoryType=UITableViewCellAccessoryDisclosureIndicator;
}

Вам не хватает части else.selectionStyle и accessoryType установлены на то, что они были установлены ранее - вы упускаете возможность правильно настраивать ячейки для всех других ячеек, кроме этой специальной.

Каждый тип ячейки должен действительно получить свой собственный идентификатор, хотя,Если добавление / удаление подпредставлений работает так, как ожидалось, по этому коду трудно сказать.

Одна мысль: так как вы на самом деле не используете много ячеек здесь, вы можете даже отключить повторное использование, изменив

static NSString *kDisplayCell_ID = @"DisplayCellID";
cell = [tableView dequeueReusableCellWithIdentifier:kDisplayCell_ID];

до

static NSString *kDisplayCell_ID = nil;

Это просто всегда будет производить новую ячейку.Я бы не рекомендовал это в общем случае.

0 голосов
/ 01 декабря 2011

Это связано с cellReusability, и в течение долгого времени оно тратит впустую время и усилия многих разработчиков.Если бы вы знали концепцию повторного использования ячеек, вы бы знали, что при прокрутке индекс строки и разделов останется прежним (хотя вы ожидаете, что он будет другим для другой позиции на uiTableView).

Единственный способ - subClass UITableViewCell и создать свой собственный CustomUITableViewCell, и реализовать его с помощью индикатора раскрытия, или противостоять вашему вводу просто небольшого TableView, который умещается на экране и составляет scrollable = NO.

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