繁体   English   中英

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

[英]iOS 7 doesn't show cancel button of search bar in navigation bar

在应该在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中的故意更改吗? 如果是的话,应该是什么选择?

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

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

根据开发人员文档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在添加到UINavigationBar时改变了行为或UISearchDisplayController / UISearchBar 看看UIKit部分下的最后一个要点(虽然不清楚究竟发生了什么变化)。


您可能还想尝试使用UISerachDisplayController 更简单的是将UISearchBar嵌入UITableView的标题中。

我只是通过添加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,否则你会得到两个“取消”按钮..

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

iOS 7与导航栏中的iOS 6不同,因此如果要在导航栏中显示UISearch栏,可以尝试以下操作:

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

希望这对你有用

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

-(void)searchDisplayControllerWillBeginSearch:(UISearchDisplayController *)controller{
    controller.searchBar.showsCancelButton = YES;
}

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

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

- (BOOL)searchBarShouldBeginEditing:(UISearchBar *)searchBar
{
    searchBar.showsCancelButton = YES;
    return YES;
}

在我看来这是一个错误。 继承我的解决方法。 它并不完美,但它适用于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

有两种选择:

  1. 将子视图等搜索栏添加到uiviewcontroller.view,并在需要时隐藏导航栏
  2. 在uiviewcontroller.navigationItem.rightBarButtonItem中添加一个取消按钮

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM