Iphone 如何实现正确的uinavigationbar后退按钮功能

Iphone 如何实现正确的uinavigationbar后退按钮功能,iphone,objective-c,ios,Iphone,Objective C,Ios,当我单击搜索显示控制器的“取消”按钮时,我想返回到上一个视图控制器。我使用了以下代码: [self.navigationController popToViewController: [self.navigationController.viewControllers objectAtIndex:0] animated:YES]; 但它给了我以下错误: *由于未捕获异常“NSInternalInconsistencyException”,正在终止应用程序,原因:“搜索内容” 导航控制器不得在-

当我单击搜索显示控制器的“取消”按钮时,我想返回到上一个视图控制器。我使用了以下代码:

[self.navigationController popToViewController: [self.navigationController.viewControllers objectAtIndex:0] animated:YES];
但它给了我以下错误:

*由于未捕获异常“NSInternalInconsistencyException”,正在终止应用程序,原因:“搜索内容” 导航控制器不得在-setActive:YES和-setActive之间切换 -setActive:否'


如果您只需返回到上一个视图,则无需popToViewController,只需在navigationcontroller上添加一个后退按钮,然后单击该按钮即可返回:-

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];
UINavigationController*navController=self.navigationController;
[UIView beginAnimations:nil上下文:NULL];
[UIView设置动画持续时间:0.7];
[UIView setAnimationTransition:forView:navController.view缓存:否];
[导航控制器PopViewController激活:否];
[UIView委员会];

索引0处的对象是根视图控制器。因此,它是堆栈中的第一个对象。但只能弹出最后一个对象。而不是使用

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


[self.navigationController PopViewControllerInitiated:是]


将带您返回堆叠在此导航控制器中的上一个视图控制器。应该可以了。

我的问题是uinavigator无法将searchdisplay控制器设置为Active,因此我通过添加以下代码来解决问题:

[self.searchDisplayController设置激活:否]


[self.navigationController PopViewControllerInitiated:是]

错误是:

*在-[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”之间更改。

我遇到了相同的问题,并找到了解决方案

诀窍是不要让
searchDisplayController
调用
-setActive:animated:
任何地方,但在
中,视图将消失。
因此,您应该将视图控制器设置为
搜索栏
的代理(捕捉点击“取消”按钮),并在
搜索显示控制器
激活时在背景上放置一个隐藏按钮(捕捉点击空屏幕空间)

在视图控制器中,实现以下方法:

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

我使用了第二个代码,因为我想返回到上一个视图,但它给了我相同的错误。这是最简单的方法,假设你只想返回导航堆栈中的一个VC。很难从你描述的内容中分辨出错误发生的原因。我猜你是对导航栏做了什么导致了这个错误。从有关委派属性的UINavigationBar文档中:“如果导航栏是由导航控制器创建并由该对象管理的,则不得更改此属性的值。导航控制器充当其创建的任何导航栏的委派。”–感谢发布此消息,它也解决了我的问题。
[self.navigationController popToViewControllerAnimated:YES];
- (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];
}