20

在应该在 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

这是我在文档中遗漏的 iOS 7 中的故意更改吗?如果是,应该是什么替代方案?

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

4

8 回答 8

14

看起来您所做的一切都是正确的,但显然 Apple 在 iOS 7 中已经改变了一些事情。根据iOS 7 中的这个 SO 问题,取消按钮不会出现在UISearchBar嵌入的UINavigationBar.

根据开发人员文档,该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

您可能还想查看iOS 7 更新日志。看起来Apple在添加到UISearchDisplayController. 看看 UIKit 部分下的最后一个要点(尽管不清楚具体发生了什么变化)。UISearchBarUINavigationBar


您可能还想尝试使用UISerachDisplayController. 可能更容易的是将 嵌入UISearchBarUITableView.

于 2013-09-28T15:31:31.487 回答
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 版本是否 >= 7.0,否则您将获得两个“取消”按钮..

顺便说一句,此方法允许您拥有始终启用的“取消”按钮

于 2013-10-28T03:01:33.730 回答
2

如果您将 UISearchBar 与 UISearchDisplayController 一起使用,则只需在“searchDisplayControllerWillBeginSearch”委托方法中设置取消按钮即可显示,如下所示:(iOS 7 测试)

-(void)searchDisplayControllerWillBeginSearch:(UISearchDisplayController *)controller{
    controller.searchBar.showsCancelButton = YES;
}
于 2013-10-27T06:50:48.130 回答
2

iOS 7 和 iOS 6 的导航栏不同,所以如果你想在导航栏中显示 UISearch 栏,你可以试试这个:

把你的 UISearchbar 放在这样的 UIView 上[self.searchView addSubview self.searchBar],然后像这样将导航栏的 titleView 设置为你的 searchViewself.navagitioncontroller.navigationItem.titleView = self.searchView

希望这对你有用

于 2013-10-16T06:35:47.583 回答
1

iOS6 和 iOS7 之间似乎确实存在变化,因为xxxDidYYY方法对 UI 的更改有时不起作用,您必须在xxxWillYYY方法或从主事件循环执行的某些代码中进行更改(例如,在块或短暂延迟后)。

在你的情况下,试试这个:

- (BOOL)searchBarShouldBeginEditing:(UISearchBar *)searchBar
{
    searchBar.showsCancelButton = YES;
    return YES;
}
于 2013-09-28T15:32:24.803 回答
1

这确实是从 7.1 开始修复的错误。

于 2014-04-15T01:52:02.237 回答
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
于 2013-11-15T09:57:55.677 回答
1

有两种选择:

  1. 向 uiviewcontroller.view 添加类似子视图的搜索栏,并在需要时隐藏导航栏
  2. 添加取消按钮到 uiviewcontroller.navigationItem.rightBarButtonItem

我的偏好是第二个,但第一个看起来更原生。

于 2014-02-18T10:09:19.450 回答