15

まったく理解できない、この本当に奇妙な現象に出くわしました。UITableView を管理する UITableViewController があります。ものすごく単純。また、テーブル ビューのコンテンツを検索するための UISearchDisplayController もあります。検索機能により、テーブル ビューで表示されたコンテンツのアイテムを削除できます。したがって、ユーザーが検索中に見つけた項目の 1 つを削除することを選択した場合、UISearchDisplayController のテーブル ビューだけでなく、UITableViewController のテーブル ビューもリロードしたいと考えています。これを行うと、通常のテーブル ビューのセクションが飛び出し、UISearchDisplayController の上に表示されます。それは本当にかなり奇妙です。それを説明する最良の方法は、画像を使用することだと思います:

http://img46.imageshack.us/img46/2818/screenshot20100905at140.png

この問題の原因を知っている人、または回避策を知っている人がいれば、それは素晴らしいことです。

4

9 に答える 9

7

再度更新

結局のところ、テーブルのヘッダーがバックグラウンドでリロードされると、何があっても検索コントローラーの前に表示されます。

これを解決するには、fetchedResultsController を無効にし (nil に設定)、検索が消えたときに必要に応じて再度遅延ロードするようにしました。

更新 - 以下の元の回答

私の場合、メインのテーブルビュー用と検索用に 1 つずつ、2 つの fetchedResultsControllers を使用しています。

セクション ヘッダーを追加するときにアニメーションを防止すると、このバグが防止されることがわかりました。したがって、searchDisplayController.active の間は、セクション変更のアニメーションを無効にするだけです。以下のコードを参照してください。

- (void)controller:(NSFetchedResultsController *)controller didChangeSection:(id <NSFetchedResultsSectionInfo>)sectionInfo
           atIndex:(NSUInteger)sectionIndex forChangeType:(NSFetchedResultsChangeType)type
{
    if (!self.reordering) {
        UITableView *myTableView = controller == __fetchedResultsController ? self.tableView : self.searchDisplayController.searchResultsTableView;
        UITableViewRowAnimation animation;
        if (self.searchDisplayController.active) {
            animation = UITableViewRowAnimationNone;
        } else {
            animation = UITableViewRowAnimationFade;
        }

        switch(type)
        {
            case NSFetchedResultsChangeInsert:
                [myTableView insertSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:animation];
                break;

            case NSFetchedResultsChangeDelete:
                [myTableView deleteSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:animation];
                break;
        }
    }
}

元の答え

他の答えは、実際にはそれ自体では機能しません。その理由は、表示されているヘッダーが searchDisplayController の tableview のヘッダーではないためです。何らかの理由でビュー階層の検索テーブル ビューの上に追加されているのは、メイン テーブルビューのヘッダーです。

searchDisplayController.active = YESのときにメインテーブルビューの更新を無効にすることで、この問題を解決しました。

私の場合、遅延ロードされたフェッチ結果コントローラーを使用しているので、次のようにしました。

- (void)searchDisplayController:(UISearchDisplayController *)controller didHideSearchResultsTableView:(UITableView *)tableView {
    [self.tableView reloadData];
}

- (void)searchDisplayController:(UISearchDisplayController *)controller willShowSearchResultsTableView:(UITableView *)tableView {
    self.fetchedResultsController.delegate = nil;
    self.fetchedResultsController = nil;
}

ただし、メインのテーブルビューで reloadData をバックグラウンドで表示したい場合、セクションヘッダーがまだ暗い領域の前に浮いているという問題があります。

誰かがこれに対するより良い解決策を持っていますか? UISearchDisplayController でカバーされている間にデータがリロードされると、viewForHeaderInSection と titleForHeaderInSection の正当なバグのようです。

私にとって最も簡単な答えは、検索ビューをオーバーライドして、バックグラウンド テーブルが表示されないようにすることです。しかし、それはアプリの「アップルらしさ」を奪います。

于 2011-05-08T18:29:12.663 に答える
2

私も最近これに遭遇しました...私が決めたアプローチは、UISearchDisplayControllerがsearchResultsTableViewを非表示にするまで、中断されたシリアルディスパッチキューにメインのtableViewへの更新をキューに入れることでした。searchResultsTableView がそのレイヤーを引き継いだ場合、セクション ヘッダーがメインの tableView を介して表示されないため、おそらくこれをバグと見なします。

于 2012-11-19T17:56:12.477 に答える
2

基になるテーブルの表示されている行のみを再読み込みすることで、iOS 7 でこれを解決しました。

- (void)searchDisplayController:(UISearchDisplayController *)controller didHideSearchResultsTableView:(UITableView *)tableView
{
   [self.tableView reloadRowsAtIndexPaths:[self.tableView indexPathsForVisibleRows] withRowAnimation:UITableViewRowAnimationNone];
}
于 2014-05-07T09:20:27.750 に答える
0

を使用しているためUITableViewControllerself.viewは のTableViewで、UITableViewControllerSearchDisplayControllerのにContainerView追加されます。を使用するだけです。self.viewUITableViewControllerUIViewcontroller

于 2015-03-31T13:00:51.410 に答える
0
[self.searchDisplayController.searchResultsTableView reloadData];
于 2015-01-14T06:46:53.310 に答える
0

修正しました..

viewDidLoad に次の行を追加します

searchDisplayController.searchResultsTableView.delegate = self;
searchDisplayController.searchResultsTableView.dataSource = self;

それは私のためにそれを修正しました...

于 2013-12-03T11:52:46.927 に答える
-1

これで理解できたと思いますが、誰かがこの質問に出くわした場合に備えて: これはおそらく、UITableViewController が検索テーブルとメイン テーブルのデータ ソース/デリゲートであるためです。つまり、おそらく、両方のテーブル ビューに対して同じ UITableViewDelegate/DataSource メソッドを実行しており、両方のテーブルに対して同じセクション ヘッダーを返しています。検索結果テーブルを個別に処理していることを確認してください。

- (NSString *)tableView:(UITableView *)aTableView titleForHeaderInSection:(NSInteger)section {
    if (aTableView == [[self searchDisplayController] searchResultsTableView]) {
        return nil;
    }
    // Return a title appropriate for self.tableView here
}
于 2011-04-07T14:32:34.783 に答える