66

ユーザーが検索バーの編集を開始するたびUISearchDisplayControllerに、検索コントローラーがアクティブになり、検索テーブルビューを表示している間、ビューのナビゲーションバーが非表示になります。UISearchDisplayController再実装せずにナビゲーションバーが非表示になるのを防ぐことはできますか?

4

15 に答える 15

60

UISearchDisplayControllerを少しデバッグしたところ、ナビゲーションバーを非表示にするためにUINavigationControllerのプライベートメソッドを呼び出していることがわかりました。これは-setActive:animated:で発生します。UISearchDisplayControllerをサブクラス化し、このメソッドを次のコードで上書きすると、ナビゲーションバーが既に非表示になっているように見せかけることで、ナビゲーションバーが非表示になるのを防ぐことができます。

- (void)setActive:(BOOL)visible animated:(BOOL)animated;
{
    if(self.active == visible) return;
    [self.searchContentsController.navigationController setNavigationBarHidden:YES animated:NO];
    [super setActive:visible animated:animated];
    [self.searchContentsController.navigationController setNavigationBarHidden:NO animated:NO];
    if (visible) {
        [self.searchBar becomeFirstResponder];
    } else {
        [self.searchBar resignFirstResponder];
    }   
}

これがあなたのために働くかどうか私に知らせてください。また、これが将来のiOSバージョンで壊れないことを願っています...iOS4.0でのみテストされています。

于 2010-07-15T16:00:50.183 に答える
52

最も単純なソリューションであり、ハッキングはありません。

@interface MySearchDisplayController : UISearchDisplayController

@end

@implementation MySearchDisplayController

- (void)setActive:(BOOL)visible animated:(BOOL)animated
{
    [super setActive: visible animated: animated];

    [self.searchContentsController.navigationController setNavigationBarHidden: NO animated: NO];
}

@end
于 2012-09-21T11:47:02.530 に答える
51

UISearchControlleriOS 8で導入された新しいクラスhidesNavigationBarDuringPresentationには、ナビゲーションバーを表示したままにする場合にfalseに設定できるプロパティがあります(デフォルトでは非表示のままです)。

于 2014-10-21T09:49:04.517 に答える
28

上記の答えは私にはうまくいきませんでした。私の解決策は、UISearchDisplayControllerをだまして、UINavigationControllerがないと思わせることです。

ビューコントローラで、このメソッドを追加します

- (UINavigationController *)navigationController {
    return nil;
}

本当に悪い考えのように見えますが、これは私にとって有害な副作用はありませんでした...ナビゲーションコントローラーに到達する必要がある場合は、を使用して[super navigationController]ください。

于 2011-05-02T17:37:26.123 に答える
10

UISearchControlleriOS 8.0以降、 'sself.searchController.hidesNavigationBarDuringPresentationプロパティをfalseに設定することで同じ動作を実現できます。

Swiftのコードは次のようになります。

searchController.hidesNavigationBarDuringPresentation = false
于 2016-02-04T08:18:19.000 に答える
9

UISearchDisplayControllerをサブクラス化せずに、これを別の方法で試しました。UISearchDisplayControllerのデリゲートを設定するUIViewControllerクラスで、searchDisplayControllerDidBeginSearch:を実装し、使用を追加します

[self.navigationController setNavigationBarHidden:NO animated:YES];

私のためにトリックをしました、それが役立つことを願っています。

于 2010-10-23T17:26:50.500 に答える
4

少し違う問題に取り組んでいるときに、これに遭遇しました。UISearchDisplayControllerを使用しているときに、検索バーをナビゲーションバー(下ではなく)に配置したいと思います。

ナビゲーションバーに検索バーを配置するのは難しくありません(UISearchBarとUINavigationItemを参照)。ただし、UISearchDisplayControllerは、検索バーが常にナビゲーションバーの下にあると想定し、(ここで説明するように)検索に入るときにナビゲーションバーを非表示にすることを要求するため、状況がひどく見えます。さらに、UISearchDisplayControllerは、検索バーを通常よりも明るく着色します。

私は解決策を見つけました。秘訣は、UISearchDisplayControllerがUISearchBarをまったく制御できないように(直感に反して)フックを解除することです。xibsを使用している場合、これは検索バーインスタンスを削除するか、少なくともアウトレットのフックを解除することを意味します。次に、独自のUISearchBarを作成します。

- (void)viewDidLoad
{
    [super viewDidLoad];

    UISearchBar *searchBar = [[[UISearchBar alloc] init] autorelease];
    [searchBar sizeToFit]; // standard size
    searchBar.delegate = self;

    // Add search bar to navigation bar
    self.navigationItem.titleView = searchBar;
}

ユーザーが検索バーをタップしたときに手動で検索表示コントローラーをアクティブにし(で-searchBarShouldBeginEditing:)、ユーザーが検索を終了したときに手動で検索バーを閉じる必要があります(で-searchDisplayControllerWillEndSearch:)。

#pragma mark <UISearchBarDelegate>

- (BOOL)searchBarShouldBeginEditing:(UISearchBar *)searchBar {
    // Manually activate search mode
    // Use animated=NO so we'll be able to immediately un-hide it again
    [self.searchDisplayController setActive:YES animated:NO];

    // Hand over control to UISearchDisplayController during the search
    searchBar.delegate = (id <UISearchBarDelegate>)self.searchDisplayController;

    return YES;
}

#pragma mark <UISearchDisplayDelegate>

- (void) searchDisplayControllerDidBeginSearch:(UISearchDisplayController
*)controller {
    // Un-hide the navigation bar that UISearchDisplayController hid
    [self.navigationController setNavigationBarHidden:NO animated:NO];
}

- (void) searchDisplayControllerWillEndSearch:(UISearchDisplayController
*)controller {
    UISearchBar *searchBar = (UISearchBar *)self.navigationItem.titleView;

    // Manually resign search mode
    [searchBar resignFirstResponder];

    // Take back control of the search bar
    searchBar.delegate = self;
}
于 2011-12-21T23:13:12.347 に答える
3

本当に素晴らしい解決策ですが、iOS6でアプリがクラッシュしていました。それを機能させるには、次の変更を加える必要がありました。

@implementation ICSearchDisplayController

    - (void)setActive:(BOOL)visible animated:(BOOL)animated
    {
        if (visible == YES) {
            [super setActive:visible animated:animated];
            [self.searchContentsController.navigationController setNavigationBarHidden:NO animated:NO];
        } else {
            [super setActive:NO animated:NO];
        }
    }
于 2012-12-08T17:52:28.533 に答える
3

これは私にとってそれを解決するようです。iOS5/6.1の両方でテスト済み。私が見ることができた視覚的な問題はありません。

- (void)viewDidAppear
{
    [super viewDidAppear];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillAppear:) name:UIKeyboardWillShowNotification object:nil];
}

-(void)viewWillDisappear:(BOOL)animated{
    [super viewWillDisappear:animated];
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}

- (void)keyboardWillAppear:(NSNotification *)notification
{
    [self.navigationController setNavigationBarHidden:NO animated:NO];
}

-(void)viewDidLayoutSubviews{
    [self.navigationController setNavigationBarHidden:NO animated:NO];
}
于 2013-03-12T01:32:32.860 に答える
3

iOS 7は物事を少し台​​無しにします...私にとってこれは完璧に機能しました:

/**
 *  Overwrite the `setActive:animated:` method to make sure the UINavigationBar 
 *  does not get hidden and the SearchBar does not add space for the statusbar height.
 *
 *  @param visible   `YES` to display the search interface if it is not already displayed; NO to hide the search interface if it is currently displayed.
 *  @param animated  `YES` to use animation for a change in visible state, otherwise NO.
 */
- (void)setActive:(BOOL)visible animated:(BOOL)animated
{
    [[UIApplication sharedApplication] setStatusBarHidden:YES];
    [self.searchContentsController.navigationController setNavigationBarHidden:YES animated:NO];

    [super setActive:visible animated:animated];

    [self.searchContentsController.navigationController setNavigationBarHidden:NO animated:NO];
    [[UIApplication sharedApplication] setStatusBarHidden:NO];
}

ステータスバーを表示/非表示にする理由

于 2014-03-27T10:09:49.473 に答える
1

最善の解決策は、UISearchDisplayControllerを自分で実装することだと思います。

それほど難しいことではありません。UIViewControllerにUISearchBarDelegateを実装し、検索結果を表示するためにUITableViewを含めるだけで済みます。

于 2011-08-23T02:08:49.750 に答える
0

@Pavelの作品は完璧に機能します。しかし、これをUIPopoverControllerに取り込もうとしていたのですが、検索バーのテキストフィールドが最初のレスポンダーになると、フィールド内のテキストがわずかにプッシュされ、少し見苦しいので、に設定してsuperメソッドを 呼び出すことで修正しました。animatedNO

于 2012-12-08T09:54:08.990 に答える
0

jrcが指摘したように、「UISearchDisplayControllerをUISearchBarの制御から外す」ことは私にとってはうまくいくようです。UISearchDisplayControllerを作成するときにパラメーターとしてnilを渡すと、ナビゲーションバーは常に表示されたままになります。

searchDisplayController = [[UISearchDisplayController alloc] initWithSearchBar:nil contentsController:self];
于 2013-04-15T08:34:46.300 に答える
0

私はViewControllerにカスタムナビゲーションバーを追加していましたが、これは検索で非表示になりました。

- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText{
    [self.view addSubview:_navBar];
}

_navBarはプログラムで追加されたUINavigationBarであり、これを行うことでナビゲーションバーが非表示になるのを防ぎました。

于 2015-02-10T06:08:53.937 に答える
0

stigiの答えに追加したかっただけです。検索をキャンセルして検索を再開すると、検索結果テーブルはタッチに反応しないため、次の行を追加する必要があります

self.searchResultsTableView.alpha = 1;

したがって、更新されたコードは次のように見えます

 - (void)setActive:(BOOL)visible animated:(BOOL)animated;
 {
    if(self.active == visible) return;
    if (visible) {
        [self.searchContentsController.navigationController setNavigationBarHidden:YES animated:NO];
        [super setActive:visible animated:animated];
        [self.searchContentsController.navigationController setNavigationBarHidden:NO animated:NO];
        self.searchResultsTableView.alpha = 1;
        [self.searchBar becomeFirstResponder];
    } else {
        [super setActive:visible animated:animated];
        [self.searchBar resignFirstResponder];
    }
}
于 2015-07-29T10:53:43.893 に答える