我有一个UISearchDisplayController和UISearchBar通过我的笔尖连接到我的ViewController。
我想隐藏取消按钮,以便用户永远不会看到它。问题是以下代码隐藏了按钮,但仅在将其显示给用户一毫秒后(例如,它在模拟器和设备上闪烁然后消失在视图之外)。
- (void)searchDisplayControllerDidBeginSearch:(UISearchDisplayController *)controller
{
controller.searchBar.showsCancelButton = NO;
}
有没有更好的方法来隐藏它?
答案 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)
将UISearchBar
与UISearchController
一起使用时出现此问题。我使用自己的取消按钮作为带有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