[英]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.