如何实现正确的uinavigationbar后退buttonfunction

我想回到以前的视图控制器,当我点击我的search显示控制器的取消button我使用的代码:

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

但它给了我以下错误:

*终止应用程序由于未捕获的exception“NSInternalInconsistencyException”,原因:'search内容导航控制器不得在-setActive:YES和-setActive:NO之间更改

[self.navigationController popViewControllerAnimated:YES];

将带您回到堆叠在此导航控制器中的前一个视图控制器。 应该这样做..

我的问题是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] *终止应用程序由于未捕获的exception'NSInternalInconsistencyException',原因:'search内容导航控制器不能在-setActive:YES和-setActive:NO之间切换

我有同样的问题,并find了解决办法。

诀窍是不给searchDisplayController调用-setActive:animated:任何地方,但在-viewWillDisappear 。 所以你应该让你的视图控制器成为searchBar一个委托(捕获“取消”button上的点击),并在searchDisplayController变为活动状态时searchDisplayController隐藏的button(以捕获空白的屏幕空间)。

在你的视图控制器中实现这些方法:

 - (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]; } 

你不需要popToViewController,如果你所要做的只是回到前一个视图,只需在navigationcontroller上添加一个后退button,你可以点击它返回:

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

或者如果你真的想popup视图使用这个:

 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]; 

索引0处的对象是根视图控制器。 所以它是堆栈中的第一个对象。 但是你只能popup最后一个对象。 而不是使用

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

使用

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

要么

 [self.navigationController popToViewControllerAnimated:YES];