[英]Hide UISearchBar Cancel Button
我有一个 UISearchDisplayController 和 UISearchBar 通过我笔尖的 Outlets 连接到我的 ViewController。
我想隐藏取消按钮,以便用户永远不会看到它。 问题是下面的代码隐藏了按钮,但只有在向用户显示一毫秒之后(例如,它在模拟器和设备上闪烁,然后消失在视野之外)。
- (void)searchDisplayControllerDidBeginSearch:(UISearchDisplayController *)controller
{
controller.searchBar.showsCancelButton = NO;
}
有没有更好的方法来隐藏它?
我设法通过UISearchBar
并覆盖此方法来隐藏“取消”按钮:
-(void)layoutSubviews{
[super layoutSubviews];
[self setShowsCancelButton:NO animated:NO];
}
我有同样的问题,但以不同的方式修复它。
对于那些不能或不想UIKeyboardWillShowNotification
UISearchDisplayController
子类的人,我通过在UIKeyboardWillShowNotification
上添加一个侦听器并在UIKeyboardWillShowNotification
设置[self setShowsCancelButton:NO animated:NO]
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:
中将viewWillDisappear:
!
希望这可以帮助!
与 Nimrod 的回答类似,您还可以UISearchDisplayController
并实现setActive:animated:
方法:
- (void)setActive:(BOOL)visible animated:(BOOL)animated {
[super setActive:visible animated:animated];
self.searchBar.showsCancelButton = NO;
}
这似乎是 Xcode 中的一个错误。 我将此错误提交给 Apple 的错误报告站点,他们已跟进要求提供更多示例代码和用例。
感谢大家尝试解决这个问题。
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
}
}
}
将UISearchBar
与UISearchController
一起使用时遇到了这个问题。 我正在使用我自己的取消按钮,因为取消按钮没有在 iPad上显示,而且showsCancelButton = YES
,现在它不会在 iPhone 上使用showsCancelButton = NO
隐藏!
以下对我有用。
设置委托和初始值:
- (void)viewDidLoad
{
// ...
self.searchController.searchBar.showsCancelButton = NO;
self.searchController.searchBar.delegate = self;
}
文showsCancelButton
开始编辑后,将showsCancelButton
重置为NO
0.1s。
#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;
});
}
如果你想避免子类化,实现
searchController.searchBar.showsCancelButton = false;
在这两个委托方法中(不要忘记分配委托):
- (void)updateSearchResultsForSearchController:(UISearchController *)searchController
- (void)didPresentSearchController:(UISearchController *)searchController
每次更新搜索栏时都会调用第一个(默认情况下取消按钮可见),第二个用于第一次激活搜索栏。
如果在编辑搜索栏的搜索字段时出现取消按钮,您可以执行以下操作; 子类化搜索栏并让它实现UITextFieldDelegate
协议:
@interface CustomAlignedSearchBar : UISearchBar<UITextFieldDelegate>
然后实现textFieldDidBeginEditing:
并执行以下操作:
- (void)textFieldDidBeginEditing:(UITextField *)textField{
[self setShowsCancelButton:self.cancelButtonShown animated:NO];
}
这将确保取消按钮不会出现。
在 iOS8 中弃用 UISearchDisplayController 后,Apple 将句柄搜索呈现给 UISearchControllerDelegate。
因此您可以覆盖 searchBar 以隐藏取消按钮,如下所示:
- (void)didPresentSearchController:(UISearchController *)searchController {
[searchController.searchBar setShowsCancelButton:NO];
}
如果您需要从非活动状态隐藏取消按钮,您需要在 init 上设置 searchBar :
search = [[UISearchController alloc] initWithSearchResultsController:nil];
[search.searchBar setShowsCancelButton:NO];
在 iOS 13.0 及更高版本上, UISearchController具有您可以使用的此属性:
@property (nonatomic) BOOL automaticallyShowsCancelButton API_AVAILABLE(ios(13.0)); // Default YES
仅基于我之前遇到的问题,您是否尝试将其设置为:
- (void)searchDisplayControllerWillBeginSearch:(UISearchDisplayController *)controller
我不知道如何在你的问题中问这个问题,如果这是不合适的,抱歉。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.