16

内にネストされた を使用したUISearchDisplayControllerセットアップがあります。セルの選択が行われると、メソッドがトリガーされ、新しいビューが親ナビゲーション コントローラーにプッシュされます。この新しいビューでは、エントリ時にナビゲーション バーが非表示になっている必要があります。UITableViewControllerUINavigationControllerUITableView's didSelectRowAtIndexPath

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

メソッドでこの行を使用didSelectRowAtIndexPathして、ナビゲーション バーを非表示にします。これは、検索コントローラーを使用せずに行が選択されている場合は正常に機能しますが、検索結果を選択する場合はオーバーライドされます。UISearchDisplayController行が選択された後、navigationBar を非表示に戻す権利があるようです。

setNavigationBarHidden呼び出しをターゲット ビューのメソッドに移動するとviewWillAppear、結果は同様になります。hide 呼び出しを に配置することで機能させることができますがviewDidAppear、これは非常にぎこちないトランジション効果になり、ぴくぴくして場違いに感じます。新しいビューが画面にスライドする前に、ナビゲーションバーを既に非表示にしたいと思います。

ナビゲーションバーの非表示がどこで発生しているか、および/またはこの動作をオーバーライドできる方法を知っている人はいますか?

4

5 に答える 5

6

これは最も洗練されたソリューションではないかもしれませんが、まさにあなたが望んでいることを実行すると信じています。私は同様の問題に遭遇しました.私の解決策は、次のように0秒の遅延後に呼び出されるナビゲーションバーを非表示にするメソッドを持つことでした.

呼び出されるメソッドは次のとおりです。

-(void) hideNavBar {
    if (self.navigationController.navigationBar.hidden == NO)
    {
        [self.navigationController setNavigationBarHidden:YES animated:YES];
    }
}

次に、viewDidLoad メソッドには次のように記述します。

[self performSelector:@selector(hideNavBar) withObject:nil afterDelay:0.0];

これは機能し、瞬時にナビゲーション バーを削除します。アニメーションが必要な場合、または遅延後に削除する場合は、遅延時間を修正できます。[self hideNavBar] を試してみましたが、うまくいきませんでした。

これが役に立てば幸いです。誰かがよりエレガントなソリューションを持っている場合、私は興味があります!

于 2011-06-13T22:12:43.547 に答える
2

わかりました、これは数時間私を悩ませましたが、ついに動作するようになりました! 問題は、UISearchDisplayController がナビゲーション バーを非表示にしたかどうかを追跡し、非表示にした場合は、ビューが閉じられた後に復元することです。そのため、上記の回答の多くでは、新しいビューが押されたときにバーのアニメーションの末尾が非表示になっていることがわかります。ただし、検索表示コントローラーをだますことで、この動作を変更できます。

最初: UISearchDisplayController のサブクラス化

hereにあるナビゲーションコントローラーが非表示にならないようにする方法に関する回答に従って、ナビゲーションバーを非表示に保つようにコードを変更しました。

- (void)setActive:(BOOL)visible animated:(BOOL)animated
{
    if(self.active == visible)
        return;

    [self.searchContentsController.navigationController setNavigationBarHidden:YES animated:YES];
    [super setActive:visible animated:animated];

    if (visible)
        [self.searchBar becomeFirstResponder];
    else{
        [self.searchBar resignFirstResponder];
        [self.searchContentsController.navigationController setNavigationBarHidden:NO animated:YES];
    }
}

スーパー setActive 関数を呼び出す前に、ナビゲーション バーを非表示にしていることに注意してください。これにより、スーパー クラスがナビゲーション バーを非表示にしようとし、その結果、アイテムの選択後に元に戻そうとすることがないように思われます。コントローラーがアクティブになると、バーは通常どおり非表示になります。また、searchBar がファーストレスポンダを辞任すると、ナビゲーション バーが復元されることにも注意してください。コントローラーからキャンセルすると、バーが復元されます。

2 番目: 終了時にナビゲーション バーを非表示にする

ビューのナビゲーション バーを非表示にすると、非表示になります。

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

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

3: 戻るときにナビゲーション バーを非表示にする

唯一の問題は、フィルタリングされたテーブルビューから行を選択すると、戻ったときにナビゲーション バーが表示されることです。これを修正するには、ビューにチェックを入れる必要があります。

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

    if(self.isFiltered){
        [self.navigationController setNavigationBarHidden:YES animated:NO];
    }

}

これは巨大なハックのように感じますが、うまく機能し、これ以上の方法はありません。

于 2013-04-06T12:42:59.197 に答える
1

同じ問題にぶつかり、この醜いハックでスムーズに動作させることができました:

- (void) viewWillDisappear: (BOOL) animated 
{
    if (searchController_.active)       
    {
        self.navigationController.navigationBar.barStyle = UIBarStyleBlackTranslucent;
        self.navigationController.navigationBar.tintColor = nil;        
    }

    [super viewWillDisappear: animated];
}


- (void) viewWillAppear: (BOOL) animated 
{       
    if (searchController_.active)       
    {
        self.navigationController.navigationBar.barStyle = UIBarStyleDefault;
    }

    [super viewWillAppear: animated];
}
于 2010-10-13T16:29:05.463 に答える
0

私は同じ問題を抱えていました:私のビューにはデフォルトでナビゲーションバーが非表示になっており、非表示にしておく方法は次のとおりです:

-(void) viewWillLayoutSubviews{
  if (self.navigationController.navigationBar.hidden == NO)
  {
    [self.navigationController setNavigationBarHidden:YES animated:YES];
  }
}

この方法では、検索バーが使用された後でもナビゲーション バーは表示されません。

于 2012-05-13T14:45:03.983 に答える
-1
- (void) viewWillDisappear: (BOOL) animated
{
    // self.searchOn property tell if full screen search is enabled
    //if (self.searchOn)
    //{

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

    [super viewWillDisappear: animated];
}


- (void) viewWillAppear: (BOOL) animated
{
    //if (self.searchOn)
    //{
         [self.navigationController setNavigationBarHidden:YES animated:YES];
    //}

    [super viewWillAppear: animated];
}
于 2013-01-09T21:16:58.353 に答える