9

iOS 7 で SearchDisplayViewController を使用するのに苦労しています。UITableViewController の上に searchBar が隠されています。

self.tableView.tableHeaderView = searchBar;

問題は、検索バーをタップして何かを入力すると、ビューがグレー表示になり、画面をランダムなポイントですばやくタップして閉じ、tableView に戻ると、検索バーが消えることです。完全に。ただし、iOS 7 のみ。

それをデバッグすると、フレームは常に同じです: 0,0,320,44. しかし、バーは見えません!

また、やってみました

self.tableView.contentOffset = CGPointMake(0,self.searchDisplayController.searchBar.frame.size.height);

すぐにやると消えます。

iOS 6 では問題なく動作します。私が見ている限り、問題は iOS 7 のみです。

それが何に依存しているのかわかりませんが、私と同じ問題に遭遇した人はいますか?

4

4 に答える 4

18

現在、iOS 7 で検索デリゲートを使用して UISearchBar をダブルタップすると、UISearchBar が消えるため、実際に機能する回避策が見つかり、バグが解決されました。

- (void)searchDisplayControllerDidEndSearch:(UISearchDisplayController *)controller
{
    if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1) {
        [self.tableView insertSubview:self.searchDisplayController.searchBar aboveSubview:self.tableView];
    }
}
于 2013-10-27T18:36:55.020 に答える
4

同じ問題が発生し、それsearchDisplayControllerDidEndSearchが 2 回呼び出されていることに気付きました。1 回目のスーパービューはself.searchDisplayController.searchBarUITableView、2 回目はまだUIViewです。

受け入れられた回答では、検索バーをダブルタップするたびにサブビューを再挿入することによる意図しない結果や不要なオーバーヘッドが心配であり、将来の iOS バージョンで壊れることも心配しています。幸いなことに、次のようにスーパービューの奇妙さを利用できます。

- (void)searchDisplayControllerDidEndSearch:(UISearchDisplayController *)controller {
    if (self.tableView != self.searchDisplayController.searchBar.superview) {
        [self.tableView insertSubview:self.searchDisplayController.searchBar aboveSubview:self.tableView];
    }
}

何が起こっているのかを推測する必要があった場合、はアクティブなときにスーパービューとしてUISearchBar一時的なビューを自動的に作成しています。これは、検索が実行されているときに表示されるビューです。UIViewが閉じられている間、スーパービューは以前UISearchBarの状態に戻されます。ただし、すぐに閉じられて適切に初期化されない場合を除きます。この場合、不適切にクリーンアップされ、 がその子として戻ることはありません。UITableViewUITableViewUISearchBar

この解決策はまだ理想的ではありません。検索バーの UX が少し良くなったので、Apple は独自のアプリで何か違うことをしているに違いないと思います。準備が整うまで、そもそも2回目のタップを処理しない方がよいと思いますUISearchBar。これを行うために他のUISearchBarDelegate方法を使用しようとしましたが、現在の動作をオーバーライドするための適切なフックが見つかりませんでした。

于 2014-06-16T23:19:30.437 に答える
0

@lehrblogger ソリューションのより洗練されたアプローチ:

- (void)addSearchDisplayControllerBackToTableView {
    if ([self.searchDisplayController.searchBar isDescendantOfView:self.tableView] == NO) {
        NSLog(@"Search bar is not in current table view, will add it back");
        [self.tableView insertSubview:self.searchDisplayController.searchBar aboveSubview:self.tableView];
        [self.searchDisplayController setActive:NO animated:YES];
    }
}

このアプローチの理由: 検索バーを検索している間、検索コンテナーに移動し、検索バーのスーパービューは常に現在のテーブル ビュー以外のビューになります。

注: ユーザーが検索バーを複数回タップしたため、これにより検索が閉じられます。

于 2016-04-25T06:43:36.870 に答える