Кнопка, добавленная в пользовательский заголовок раздела, исчезает при удалении строки - PullRequest
0 голосов
/ 16 декабря 2010

Просто столкнулся с очень странным поведением в моем приложении. Я воссоздал проблему в простейшем случае:

NSMutableArray *data;

- (void)viewDidLoad {
    [super viewDidLoad];
    data = [[NSMutableArray arrayWithObjects:@"1", @"2", @"3", nil] retain];
}

- (UIView *)tableView:(UITableView *)aTableView viewForHeaderInSection:(NSInteger)section { 
    UIView *header = [[UIView alloc] initWithFrame:CGRectMake(0.0, 0.0, self.view.frame.size.width, 32.0)];
    header.backgroundColor = [UIColor lightGrayColor];
    [header addSubview:self.button];
    return header;
}

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
    if (editingStyle == UITableViewCellEditingStyleDelete) {    
        [data removeObjectAtIndex:indexPath.row];
        [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationTop];
    }
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
    return data.count;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil] autorelease];
    cell.textLabel.text = [data objectAtIndex:indexPath.row];
    return cell;
}

- (void)dealloc {
    [super dealloc];
}

Каждый раз, когда я удаляю строку; кнопка в моем заголовке исчезает! Это происходит независимо от того, какой тип анимации строк я использую. Если я прокручиваю таблицу вверх, чтобы заголовок прокручивался; кнопка возвращается, когда возвращается заголовок. Кнопка создается в xib-файле.

Я могу обойти это одним из двух способов:

  • Перезагрузка таблицы просмотра данных после удаления; с задержкой, чтобы анимация удаления выполнялась первой.
  • Создание кнопки в viewForHeaderInSection вместо в интерфейсе Builder.

    Мне бы очень хотелось понять, что здесь происходит. Куда идет кнопка? Я подтвердил, что viewForHeaderInSection вызывается при удалении строки.

Редактировать Я пытался изменить его, чтобы кнопка создавалась в viewForHeader, а не в xib, но это вызывает другие странные проблемы ... когда я создаю или удаляю кнопку, я устанавливаю определенные свойства, такие как заголовок и включенные в зависимости от количества элементов в таблице. Когда я удаляю последнюю строку в таблице, я не вижу обновления в тексте и включенного состояния, пока не прокручиваю кнопку с экрана и снова включаю.

Ответы [ 3 ]

1 голос
/ 20 декабря 2010

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

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

0 голосов
/ 21 декабря 2010

Ну, по крайней мере, мне удалось обойти мою проблему ... Я создал iVar и свойство для представления, которое я создаю в viewForheaderAtSection, и затем я создаю новый вид, только если у меня его нет.В противном случае я просто возвращаю заголовок, который у меня уже был;что-то вроде этого:

- (UIView *)tableView:(UITableView *)aTableView viewForHeaderInSection:(NSInteger)section { 
    if (!self.myHeader){
        UIView *header = [[UIView alloc] initWithFrame:CGRectMake(0.0, 0.0, self.view.frame.size.width, 32.0)];
        header.backgroundColor = [UIColor lightGrayColor];
        [header addSubview:self.button];
        self.myHeader = header;
        [header release];
    }
    return self.myHeader;
}

Это работает, но все равно было бы здорово понять, что именно происходит.Насколько я могу судить, viewForHeaderInSection вызывается системой, но затем экземпляр представления, который я возвращаю в этом методе, фактически не используется / не показывается;по крайней мере, пока я не сделаю что-то, что заставит вид перерисоваться ...

0 голосов
/ 20 декабря 2010

Где ваша реализация метода делегата tableView:heightForHeaderInSection:? Это необходимо для правильной работы tableView:viewForHeaderInSection:. Проверьте документы. Ссылка для делегата UITableView

Я подтвердил, что viewForHeaderInSection вызывается, когда Я удаляю строку.

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

[header bringSubviewToFront:self.button];  

после добавления кнопки.

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