Пользовательский заголовок раздела UITableView, повторяющаяся проблема

StackOverflow https://stackoverflow.com/questions/2350032

Вопрос

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

Пример изображения:

alt text alt text
Мой Пользовательский Заголовок:

- (UIView *) tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section { 
       UIView* customView = [[[UIView alloc]initWithFrame:CGRectMake(10.0, 0.0, 300.0, 44.0)]autorelease];
       customView.backgroundColor = [UIColor lightGrayColor];

       UILabel * headerLabel = [[[UILabel alloc] initWithFrame:CGRectZero] autorelease];
            headerLabel.backgroundColor = [UIColor clearColor];
            headerLabel.opaque = NO;
            headerLabel.textColor = [UIColor darkGrayColor];
            headerLabel.font = [UIFont boldSystemFontOfSize:16];
            headerLabel.frame = CGRectMake(10, 7, 260.0, 44.0);
            headerLabel.textAlignment = UITextAlignmentCenter;
            NSDictionary *dictionary = [self.data objectAtIndex:section];
            headerLabel.text = [dictionary objectForKey:@"Title"];

            [customView addSubview:headerLabel];


            // add button to right corner of section
        UIButton* headerButton = [[UIButton alloc] initWithFrame:CGRectMake(10, 0, 320, 44)];
            headerButton.center = CGPointMake( 160.0, 22.0);
            headerButton.backgroundColor = [UIColor clearColor];
            headerButton.tag = section;
            [headerButton   addTarget:self action:@selector(expandSection:) forControlEvents:UIControlEventTouchUpInside];

            [customView addSubview:headerButton];

            return customView;
}

Мой Метод анимации:

- (void) expandSection:(id)sender {

    if (expandedSection == [sender tag]) {
        expandedSection = -1;
        [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:[sender tag]] withRowAnimation:UITableViewRowAnimationNone];
    }else if (expandedSection == -1){
        expandedSection = [sender tag];
        [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:[sender tag]] withRowAnimation:UITableViewRowAnimationNone];
    }else{
        [self.tableView beginUpdates];  
        [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:expandedSection] withRowAnimation:UITableViewRowAnimationNone];
        expandedSection = [sender tag];
        [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:[sender tag]] withRowAnimation:UITableViewRowAnimationNone];
        [self.tableView endUpdates]; 

    }
    //[self.tableView reloadData];
}

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

Редактировать:Я полагаю, что проблема в том, что reloadSections вызывает создание экземпляра пользовательского представления.Я не могу опубликовать представление, потому что оно мне нужно как ссылка для обновления анимации.Есть какие-нибудь идеи о том, что я могу сделать, чтобы исправить это?

Это было полезно?

Решение

Решение найдено.

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

Добавить [self.TableView Повторно загружает данные];в качестве первой записи в методе "expandSection".

код:

- (void) expandSection:(id)sender {

  [self.tableView reloadData];

    if (expandedSection == [sender tag]) {
        expandedSection = -1;
        [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:[sender tag]] withRowAnimation:UITableViewRowAnimationNone];
    }else if (expandedSection == -1){
        expandedSection = [sender tag];
        [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:[sender tag]] withRowAnimation:UITableViewRowAnimationNone];
    }else{
        [self.tableView beginUpdates];  
        [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:expandedSection] withRowAnimation:UITableViewRowAnimationNone];
        expandedSection = [sender tag];
        [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:[sender tag]] withRowAnimation:UITableViewRowAnimationNone];
        [self.tableView endUpdates]; 

    }
    //[self.tableView reloadData];
}

Другие советы

У меня была аналогичная проблема, которая была вызвана использованием динамических ячеек высоты.У меня было расширяемое пользовательское представление заголовка, и когда я обновлял TableView для вставки и удаления связанных строк раздела (это означало, что они расширялись, соответственно сворачиваясь), заголовок раздела, который был подклассом UITableViewHeaderFooterView не был переработан.Таким образом, по сути, новый был выделен и добавлен поверх старого, что привело к перекрывающимся представлениям.Идентификатор ячейки был установлен правильно, так что, должно быть, было что-то еще.Когда я удалил tableView.sectionHeaderHeight = UITableViewAutomaticDimension и реализованный func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat представление было должным образом переработано, и для каждого раздела был отображен только один вид заголовка.

Другое решение, которое, как оказалось, действительно сработало, заключалось в использовании UITableViewCell вместо того , чтобы UITableViewHeaderFooterView и когда ты вернешься в func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? ты просто return cell.contenView, это сработает, потому что метод требует возвращать UIView и поскольку contentView из UITableViewCell является UIView, он работает просто отлично.Идея заключается в том, чтобы использовать механизм переработки UITableView через UITableViewCell и просто вернуть его содержимое после его настройки.

Заключение.Проблема, которая, вполне возможно, может быть вызвана UITableViewHeaderFooterView когда используется с ячейками TableView самостоятельного размера и UITableViewAutomaticDimension вместо ручного вычисления высоты ячейки.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top