如何实现正确的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];