簡體   English   中英

隱藏 UISearchBar 取消按鈕

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

}

UISearchBarUISearchController一起使用時遇到了這個問題。 我正在使用我自己的取消按鈕,因為取消按鈕沒有在 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM