4

検索ディスプレイコントローラーのキャンセルボタンをクリックすると、前のビューコントローラーに戻りたいのですが、次のコードを使用しました。

[self.navigationController popToViewController: [self.navigationController.viewControllers objectAtIndex:0] animated:YES];

しかし、それは私に次のエラーを与えます:

*キャッチされなかった例外「NSInternalInconsistencyException」が原因でアプリを終了します。理由:「検索コンテンツナビゲーションコントローラーは、-setActive:YESと-setActive:NOの間で変更してはなりません」

4

5 に答える 5

4

[self.navigationController popViewControllerAnimated:YES];

このナビゲーションコントローラーにスタックされていた前のビューコントローラーに戻ります。それはそれをする必要があります。

于 2012-05-13T10:05:51.743 に答える
2

私の問題は、searchdisplayコントローラーがuinavigatorによってsetActiveできないことでした。そのため、次のコードを追加して問題を解決します。

[self.searchDisplayController setActive:NO];

[self.navigationController popViewControllerAnimated:YES];

エラーは:

*-[UISearchDisplayController setActive:animated:]、/SourceCache/UIKit_Sim/UIKit-1914.84/UISearchDisplayController.m:617 2012-05-13 19:07:44.696 MyApp [3648:11903]でのアサーションの失敗*キャッチされなかった例外のためにアプリを終了します'NSInternalInconsistencyException'、理由:'検索コンテンツナビゲーションコントローラーは、-setActive:YESと-setActive:NOの間で変更してはなりません'

于 2012-05-13T18:23:36.593 に答える
2

私は同じ問題を抱えていて、解決策を見つけました。

秘訣は、で以外の場所searchDisplayControllerに電話をかけることではありません。したがって、View Controllerを(「キャンセル」ボタンのタップをキャッチするため)のデリゲートにし、アクティブになったときに(空の画面スペースのタップをキャッチするために)背景に非表示のボタンを配置する必要があります。-setActive:animated:-viewWillDisappearsearchBarsearchDisplayController

ビューコントローラで、次のメソッドを実装します。

- (void)viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated];
    [self.searchDisplayController setActive:NO animated:animated];
}

- (void)searchBarCancelButtonClicked:(UISearchBar *)searchBar
{
    [self.navigationController popViewControllerAnimated:YES];
}

- (void)backgroundClicked:(id)sender
{
    [self.navigationController popViewControllerAnimated:YES];  
}


- (void)searchDisplayControllerDidBeginSearch:(UISearchDisplayController *)controller
{
    UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
    [button addTarget:self action:@selector(backgroundClicked:) forControlEvents:UIControlEventTouchUpInside];

    CGFloat searchBarHeight = controller.searchBar.frame.size.height;
    button.frame = CGRectOffset(self.view.bounds, 0.f, searchBarHeight) ;
    [self.view addSubview:button];
}
于 2012-12-27T00:08:54.750 に答える
0

前のビューに戻るだけの場合は、popToViewControllerを実行する必要はありません。ナビゲーションコントローラーに戻るボタンを追加するだけで、クリックして戻ることができます:-

UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:@"Back"
      style:UIBarButtonItemStylePlain target:nil action:nil];
self.navigationItem.backBarButtonItem = backButton;
[backButton release]; 

または、本当にビューをポップしたい場合は、これを使用してください:-

UINavigationController *navController = self.navigationController;      

    [UIView beginAnimations:nil context:NULL]; 
[UIView setAnimationDuration: 0.7];
    [UIView setAnimationTransition:<#UIViewAnimationTransitionCurlDown#> forView:navController.view cache:NO];

    [navController popViewControllerAnimated:NO];

    [UIView commitAnimations];
于 2012-05-13T09:15:12.517 に答える
0

インデックス0のオブジェクトはルートビューコントローラです。したがって、これはスタックの最初のオブジェクトです。ただし、ポップできるのは最後のオブジェクトのみです。使用する代わりに

[self.navigationController popToViewController: [self.navigationController.viewControllers objectAtIndex:0] animated:YES];

使用する

[self.navigationController popToViewController: [self.navigationController.viewControllers lastObject] animated:YES];

また

[self.navigationController popToViewControllerAnimated:YES];
于 2012-05-13T10:01:12.660 に答える