iOS 7不会在导航栏中显示搜索栏的取消按钮

Cod*_*odo 20 uisearchbar ios ios7

在应该在iOS 6和iOS 7上运行的应用程序中,如果应用程序在iOS 7上运行,导航栏中嵌入的搜索栏的取消按钮将不再显示.在iOS 6上,它可以正常工作.

搜索栏位于导航栏的标题视图中,如果搜索栏成为第一个响应者,则应显示取消按钮:

IOS 7

在此输入图像描述

iOS 6

在此输入图像描述

在一个独立的测试用例中,代码非常简单:

@interface MyViewController : UITableViewController<UISearchBarDelegate>

@property (nonatomic) IBOutlet UISearchBar* searchBar;

@end


@implementation MyViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    self.navigationItem.titleView = self.searchBar;
}

- (void) searchBarTextDidBeginEditing: (UISearchBar*) searchBar {
    [searchBar setShowsCancelButton: YES animated: YES];
}

@end
Run Code Online (Sandbox Code Playgroud)

这是我在文档中遗漏的iOS 7中的故意更改吗?如果是的话,应该是什么选择?

如果没有,我的代码中是否犯了错误?

Sam*_*cer 14

看起来你正确地做了一切,但显然Apple已经改变了iOS 7中的一些东西.根据 iOS 7 中的这个问题,取消按钮不会出现在UISearchBar嵌入式中UINavigationBar.

根据开发人员文档,该showsCancelButton属性可能与该setShowsCancelButton:Animated方法的效果略有不同.试着这样做:

searchBar.showsCancelButton = YES;
[searchBar setShowsCancelButton:YES animated:YES];
Run Code Online (Sandbox Code Playgroud)

我不确定这是否会产生任何影响.您还可以尝试将代码放在不同的委托方法中:

- (BOOL)searchBarShouldBeginEditing:(UISearchBar *)searchBar; // return NO to not become first responder
- (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar; // called when text starts editing
Run Code Online (Sandbox Code Playgroud)

您可能还想查看iOS 7更改日志.看起来Apple改变了行为或者UISearchDisplayController/ UISearchBar当添加到a时UINavigationBar.看看UIKit部分下的最后一个要点(虽然不清楚究竟发生了什么变化).


您可能还想尝试使用UISerachDisplayController.更容易的是将其嵌入UISearchBar到标题中UITableView.


And*_*iev 12

我只是通过添加rightBarButtonItem来解决这个问题很简单:)

self.navigationItem.titleView = self.searchBar;
self.navigationItem.rightBarButtonItem = [[[UIBarButtonItem alloc] initWithTitle:NSLocalizedString(@"Cancel", nil) style:UIBarButtonItemStylePlain target:self action:@selector(didClickCancelButton:)] autorelease];
Run Code Online (Sandbox Code Playgroud)

但是你必须检查当前的iOS版本是否> = 7.0,否则你会得到两个"取消"按钮..

BTW此方法允许您使用"取消"按钮,该按钮始终启用