隐藏UISearchBar取消按钮

时间:2011-12-13 21:20:11

标签: objective-c ios cocoa-touch uisearchbar uisearchdisplaycontroller

我有一个UISearchDisplayController和UISearchBar通过我的笔尖连接到我的ViewController。

我想隐藏取消按钮,以便用户永远不会看到它。问题是以下代码隐藏了按钮,但仅在将其显示给用户一毫秒后(例如,它在模拟器和设备上闪烁然后消失在视图之外)。

- (void)searchDisplayControllerDidBeginSearch:(UISearchDisplayController *)controller 
{
    controller.searchBar.showsCancelButton = NO;
}

有没有更好的方法来隐藏它?

11 个答案:

答案 0 :(得分:37)

我设法通过继承UISearchBar隐藏“取消”按钮并覆盖此方法:

-(void)layoutSubviews{
    [super layoutSubviews];
    [self setShowsCancelButton:NO animated:NO];
}

答案 1 :(得分:15)

我有同样的问题,但以不同的方式修复它。

对于那些不想或不想继承UISearchDisplayController的人,我通过在UIKeyboardWillShowNotification上添加一个监听器并在那里设置[self setShowsCancelButton:NO animated:NO]来修复此问题。

viewWillAppear:

// Add keyboard observer:
[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(keyboardWillAppear:)
                                             name:UIKeyboardWillShowNotification
                                           object:nil];

然后你创建:

- (void)keyboardWillAppear:(NSNotification *)notification
{
    [YOUR-SEARCHBAR-HERE setShowsCancelButton:NO animated:NO];
}

别忘了添加,

[[NSNotificationCenter defaultCenter] removeObserver:self];

viewWillDisappear:

希望这有帮助!

答案 2 :(得分:8)

与Nimrod的答案类似,您也可以继承UISearchDisplayController并实施setActive:animated:方法:

- (void)setActive:(BOOL)visible animated:(BOOL)animated {
    [super setActive:visible animated:animated];
    self.searchBar.showsCancelButton = NO;
}

答案 3 :(得分:6)

这似乎是Xcode中的一个错误。我将此错误提交给Apple的错误报告网站,他们随后要求提供更多示例代码和用例。

感谢大家尝试解决这个问题。

答案 4 :(得分:3)

UISearchBarUISearchController一起使用时出现此问题。我使用自己的取消按钮作为带有showsCancelButton = YES的取消按钮wasn't showing on iPad,现在它不会隐藏在iPhone上showsCancelButton = NO

以下对我有用。

设置委托和初始值:

- (void)viewDidLoad
{
    // ... 
    self.searchController.searchBar.showsCancelButton = NO;
    self.searchController.searchBar.delegate = self;
}

文本栏开始编辑后,将showsCancelButton重置为NO 0.1秒。

#pragma mark - UISearchBarDelegate
- (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar
{
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 0.1 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
        self.searchController.searchBar.showsCancelButton = NO;
    });
}

答案 5 :(得分:2)

class CustomSearchBar: UISearchBar {

    override func setShowsCancelButton(showsCancelButton: Bool, animated: Bool) {
        super.setShowsCancelButton(false, animated: false)
    }

}

class CustomSearchController: UISearchController, UISearchBarDelegate {

    lazy var _searchBar: CustomSearchBar = {
        [unowned self] in
        let customSearchBar = CustomSearchBar(frame: CGRectZero)
        customSearchBar.delegate = self
        return customSearchBar
    }()

    override var searchBar: UISearchBar {
        get {
            return _searchBar
        }
    }

}

答案 6 :(得分:2)

如果您想避免子类化,请执行

searchController.searchBar.showsCancelButton = false;
这两个委托方法中的

(不要忘记分配代理人):

- (void)updateSearchResultsForSearchController:(UISearchController *)searchController

- (void)didPresentSearchController:(UISearchController *)searchController

每次更新searchBar时都会调用第一个(默认情况下可以看到“取消”按钮),第二个用于第一次激活searchBar。

答案 7 :(得分:0)

根据我之前遇到过的问题,您尝试过将其设置为:

- (void)searchDisplayControllerWillBeginSearch:(UISearchDisplayController *)controller

如果不合适,我不知道如何在你的问题中提出这个问题。

答案 8 :(得分:0)

如果在编辑搜索栏的搜索字段时显示取消按钮,则可以执行以下操作:继承搜索栏并让它实现UITextFieldDelegate协议:

@interface CustomAlignedSearchBar : UISearchBar<UITextFieldDelegate>

然后实施textFieldDidBeginEditing:并执行以下操作:

- (void)textFieldDidBeginEditing:(UITextField *)textField{
    [self setShowsCancelButton:self.cancelButtonShown animated:NO];
}

这将确保取消按钮不会显示。

答案 9 :(得分:0)

在iOS8中弃用UISearchDisplayController后,Apple会向UISearchControllerDelegate提供句柄搜索演示。

所以你可以覆盖searchBar来隐藏取消按钮,如下所示:

- (void)didPresentSearchController:(UISearchController *)searchController {
    [searchController.searchBar setShowsCancelButton:NO];
}

如果您需要从非活动状态隐藏取消按钮,则需要在init上设置searchBar:

search = [[UISearchController alloc] initWithSearchResultsController:nil];
[search.searchBar setShowsCancelButton:NO];

答案 10 :(得分:0)

在iOS 13.0和更高版本上, UISearchController 具有此属性,您可以使用:

@property (nonatomic) BOOL automaticallyShowsCancelButton API_AVAILABLE(ios(13.0)); // Default YES