Подтвердить что ты не робот

UITableView contentSize

Проблема с несколькими табличными представлениями в моем приложении.

Проблема возникает, когда содержимое таблицы изменяется (и, следовательно, содержимое таблицы увеличивается).

По какой-то причине contentSize UITableView остается тем же, что и я не могу прокрутить, чтобы увидеть новый контент.

Это происходит, когда конкретная ячейка становится больше (после [tableView reloadData];) или когда я добавляю новые ячейки (используя методы делегата NSFetchedResultsController).

Есть ли что-то, что мне нужно сделать для tableView, чтобы перенастроить его contentSize?

Изменить, чтобы показать код, но это всего лишь шаблонный код делегата NSFetchedResultsController...

- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller {
    // The fetch controller is about to start sending change notifications, so prepare the table view for updates.
    [self.tableView beginUpdates];
}


- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type newIndexPath:(NSIndexPath *)newIndexPath {

    UITableView *tableView = self.tableView;

    switch(type) {

        case NSFetchedResultsChangeInsert:
            [tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
            break;

        case NSFetchedResultsChangeDelete:
            [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
            break;

        case NSFetchedResultsChangeUpdate:
            [self configureCell:(OJFPunchListCell*)[tableView cellForRowAtIndexPath:indexPath] atIndexPath:indexPath];
            break;

        case NSFetchedResultsChangeMove:
            [tableView deleteRowsAtIndexPaths:[NSArray
                                           arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
            [tableView insertRowsAtIndexPaths:[NSArray
                                           arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
            break;
    }
}


- (void)controller:(NSFetchedResultsController *)controller didChangeSection:(id )sectionInfo atIndex:(NSUInteger)sectionIndex forChangeType:(NSFetchedResultsChangeType)type {

    switch(type) {

        case NSFetchedResultsChangeInsert:
            [self.tableView insertSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade];
            break;

        case NSFetchedResultsChangeDelete:
            [self.tableView deleteSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade];
            break;
    }
}


- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller {
    // The fetch controller has sent all current change notifications, so tell the table view to process all updates.
    [self.tableView endUpdates];
}

Я делал такие вещи раньше в iOS5 и никогда не испытывал проблем с этим. Кажется, это потенциально изменение iOS6?

:: EDIT::

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

Эта проблема сейчас происходит на нескольких таблицах, которые я добавил недавно.

:: EDIT::

ОК, просто выполните некоторую отладку. Когда я впервые перехожу в таблицу View, содержимое contentize.height равно 594.

Когда я добавляю новый элемент и возвращаюсь в тот же tableviewController, contentSize.height имеет значение 749.

Однако я не могу прокрутить, чтобы увидеть недавно добавленную ячейку внизу таблицыView. Это просто не прокручивается. Он отскакивает от старой высоты contentSize.

4b9b3361

Ответ 1

Я столкнулся с той же проблемой и закончил с этим обходным решением. Я устанавливаю contentSize сразу после [self.tableView endUpdates];

[self.tableView endUpdates];

NSLog(@"%f", self.tableView.contentSize.height);

self.tableView.contentSize = [self.tableView sizeThatFits:CGSizeMake(CGRectGetWidth(self.tableView.bounds), CGFLOAT_MAX)];

NSLog(@"%f", self.tableView.contentSize.height);

[self.tableView setContentInset:UIEdgeInsetsMake(50, 0, -50, 0)];

Ответ 2

У меня была такая же проблема с использованием настраиваемого контроллера представлений с двумя дочерними VC, один из которых был контрольным контроллером данных с табличным представлением +.

Я бы понял, добавив контент из одного vc и вернувшись к своей таблице, чтобы я не смог прокрутить до нового контента внизу.

Итак, в моем контроллере tableview + fetched results я корректирую размер содержимого, исходя из количества выбранных объектов, независимо от того, откуда они пришли.

В худшем случае я не добавлял контент при показе VC, но стоимость минимальная.

//In my tableview + fetched results controller class
-(void)viewDidAppear:(BOOL)animated{
    [super viewDidAppear:animated];


    NSUInteger objCount = self.fetchedResultsController.fetchedObjects.count;
    //My custom cell has a height of 50.0f, yours may not!
    CGFloat tableHeight = objCount * 50.0f;

    NSLog(@"%i objects, total height: %f",objCount,tableHeight);

    [self.tableView setContentSize:CGSizeMake(self.tableView.contentSize.width, tableHeight)];

}

Ответ 3

У меня есть динамический tableView с 'UITableViewAutomaticDimension'. Что-то происходит и после перезагрузки, и размер содержимого равен его размеру кадра. После того, как я вручную поместил размер контента в качестве размера границ таблицы, все будет работать. Надеюсь, это поможет.

table.beginUpdates()
table.contentSize = CGSize(width: table.bounds.width, height: table.bounds.height)
table.endUpdates()

И это после того, как я сделал table.reloadData()

Ответ 4

Попробуйте следующее:

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

Было проверено много способов: установите размер кадра/содержимого в виде таблицы, и никто не работает для меня. Наконец, я нахожу основную причину и решая ее простым способом (хотя и не изящно).

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

Итак, решение прост: перейдите в StoryBoard, отрегулируйте ширину представления таблицы, сделав его меньше ширины родительского представления. Кажется, что если один табличный вид создается StoryBoard, вы не можете изменить его раму по коду. Это то, что я нашел до сих пор. Я предполагаю, что это ошибка StoryBoard.

Надеюсь, это будет полезно для вас.