17

アプリのいくつかのテーブルビューに問題があります。

この問題は、テーブルの内容が変更されたときに発生します(したがって、テーブルビューの内容が大きくなります)。

何らかの理由で、UITableViewのcontentSizeは同じままです。つまり、スクロールして新しいコンテンツを表示することはできません。

これは、特定のセルが大きくなったとき([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の変更である可能性がありますか?

::編集::

これについての愚かなことは、同じアプリに他のUITableViewControllerがいくつかあり、それらはすべて正常に機能していることです。新しいセルを追加したり、動的なサイズのセルを追加したり、セルのサイズを変更したりできます。テーブルはすべて、すべてのコンテンツを上下に正しくスクロールします。

この問題は、最近追加したいくつかのテーブルビューで発生しています。

::編集::

OK、デバッグを行うだけです。最初にテーブルビューに移動したとき、contentSize.heightは594です。

次に、新しいアイテムを追加して同じtableviewControllerに戻ると、contentSize.heightは749です。

ただし、スクロールしてtableViewの下部に新しく追加されたセルを表示することはできません。そこをスクロールしません。古いcontentSizeの高さでバウンスします。

4

4 に答える 4

1

2 つの子 VC を持つカスタム ビュー コントローラーを使用すると、同じ問題が発生しました。1 つはテーブルビュー + フェッチされた結果コントローラーです。

1 つの 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)];

}
于 2013-03-05T20:59:28.727 に答える
0

「UITableViewAutomaticDimension」を使用した動的なtableViewがあります。何かが発生し、リロード後にコンテンツ サイズがフレーム サイズと同じになります。コンテンツのサイズを手動でテーブルの境界サイズに設定すると、すべてが機能します。これが役立つことを願っています。

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

そして、これは table.reloadData() を実行した後です

于 2016-12-21T15:22:12.787 に答える
-2

これを試して:

私は同様の問題に遭遇しました。私の状況では、テーブルビューをプッシュセグエによって提示されるカスタムビューコントローラーにドラッグします。テーブルビューに表示されるデータの量が一定の数を超えると、セルに触れることができませんテーブルビューの下部にあります。

テーブルビューのフレーム/コンテンツサイズを設定しても、どれもうまくいきません.最終的に、根本的な原因を見つけて、簡単な方法で解決します(優雅ではありませんが)。

まず、根本的な原因: IB によって作成されたテーブル ビューの幅が、その親ビュー コントローラーよりも大きいため、ビューの範囲外のセルには触れられません。

したがって、解決策は簡単です: StoryBoard に移動し、テーブル ビューの幅を調整して、親ビューの幅よりも小さくします。それが私が今まで見つけたものです。StoryBoardのバグだと思います。

お役に立てば幸いです。

于 2015-01-26T08:42:19.267 に答える