在应该在iOS 6和iOS 7上运行的应用程序中,如果应用程序在iOS 7上运行,导航栏中嵌入的搜索栏的取消按钮将不再显示。在iOS 6上,它可以正常工作。< / p>
搜索栏位于导航栏的标题视图中,如果搜索栏成为第一个响应者,则应显示取消按钮:
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
这是我在文档中遗漏的iOS 7中的故意更改吗?如果是的话,应该选择什么?
如果没有,我的代码是否犯了错误?
答案 0 :(得分:14)
看起来你正在做的一切都正确,但显然Apple已经改变了iOS 7中的一些东西。{7}}在iOS 7中,取消按钮没有出现在嵌入的UISearchBar
中UINavigationBar
。
根据According to this SO question,showsCancelButton
属性的效果可能与setShowsCancelButton:Animated
方法略有不同。试着这样做:
searchBar.showsCancelButton = YES;
[searchBar setShowsCancelButton:YES animated:YES];
我不确定这是否会产生任何影响。您还可以尝试将代码放在不同的委托方法中:
- (BOOL)searchBarShouldBeginEditing:(UISearchBar *)searchBar; // return NO to not become first responder
- (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar; // called when text starts editing
您可能还想查看developer documentation。看起来Apple改变了行为,或者UISearchDisplayController
/ UISearchBar
添加到UINavigationBar
时。看一下UIKit部分下的最后一个要点(虽然不清楚到底发生了什么变化)。
您可能还想尝试使用UISerachDisplayController
。更简单的方法是将UISearchBar
嵌入UITableView
的标题中。
答案 1 :(得分:12)
我只是通过添加rightBarButtonItem解决了这个问题:)
self.navigationItem.titleView = self.searchBar;
self.navigationItem.rightBarButtonItem = [[[UIBarButtonItem alloc] initWithTitle:NSLocalizedString(@"Cancel", nil) style:UIBarButtonItemStylePlain target:self action:@selector(didClickCancelButton:)] autorelease];
但是你必须检查当前的iOS版本是否为&gt; = 7.0,否则你会得到两个“取消”按钮..
BTW此方法允许您使用“取消”按钮,该按钮始终启用
答案 2 :(得分:2)
iOS 7与导航栏中的iOS 6不同,因此如果您想在导航栏中显示UISearch栏,可以试试这个:
将您的UISearchbar放在像此[self.searchView addSubview self.searchBar]
这样的UIView上,并将导航栏的titleView设置为您的searchView,如self.navagitioncontroller.navigationItem.titleView = self.searchView
希望它适合你
答案 3 :(得分:2)
如果您将UISearchBar与UISearchDisplayController一起使用,您可以在“searchDisplayControllerWillBeginSearch”委托方法中设置取消按钮以显示,如下所示:(iOS 7已测试)
-(void)searchDisplayControllerWillBeginSearch:(UISearchDisplayController *)controller{
controller.searchBar.showsCancelButton = YES;
}
答案 4 :(得分:1)
iOS6和iOS7之间似乎有一个变化,因为xxxDidYYY
方法对用户界面的更改有时不起作用,您必须使用xxxWillYYY
方法或某些方法进行更改从主事件循环执行的代码(例如,在块中或在短暂延迟之后)。
在你的情况下,试试这个:
- (BOOL)searchBarShouldBeginEditing:(UISearchBar *)searchBar
{
searchBar.showsCancelButton = YES;
return YES;
}
答案 5 :(得分:1)
在我看来这是一个错误。继承我的解决方法。它并不完美,但它适用于iOS 6和7。在iOS7上,搜索栏文本字段在取消按钮时滑过淡出,在iOS6上,文本字段宽度扩展不会动画化。
@interface FTViewController ()
@property(nonatomic, strong) UISearchBar *searchBar;
@end
@implementation FTViewController
- (void)viewDidLoad
{
[super viewDidLoad];
self.searchBar = [[UISearchBar alloc] init];
self.searchBar.delegate = self;
if (NSFoundationVersionNumber <= NSFoundationVersionNumber_iOS_6_1) {
// iOS 6.1 and older (only tested on 6.1)
[self.searchBar sizeToFit];
self.searchBar.backgroundImage = nil;
}
self.navigationItem.titleView = self.searchBar;
}
-(void)cancelBarButtonItemClicked:(id)sender
{
[self searchBarCancelButtonClicked:self.searchBar];
}
-(void)searchBarCancelButtonClicked:(UISearchBar *)searchBar
{
[searchBar resignFirstResponder];
[self.navigationItem setRightBarButtonItem:nil animated:YES];
}
-(BOOL)searchBarShouldBeginEditing:(UISearchBar *)searchBar
{
UIBarButtonItem *cancelBtn = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCancel target:self action:@selector(cancelBarButtonItemClicked:)];
[self.navigationItem setRightBarButtonItem:cancelBtn animated:YES];
return YES;
}
@end
答案 6 :(得分:1)
有两种选择:
我的偏好是第二个,但它看起来更像是第一个。
答案 7 :(得分:1)
这确实是从7.1开始修复的错误。