簡體   English   中英

Swift:searchBar - 如何更改“取消”按鈕標題

[英]Swift: searchBar - how to change "Cancel" Button title

我有采用 UISearchBarDelegate 的 UIViewController。 並將其委托設置為 self:resultSearchController.searchBar.delegate = self。 它工作正常我用 searchBarCancelButtonClicked 方法測試它%

func searchBarCancelButtonClicked(searchBar: UISearchBar) {
        println("Сancel button tapped")
    }

我在控制台中看到“Сancel button tapped”。 但我想更改“取消”按鈕標題,但我不知道怎么做。 我試過:

func searchBarTextDidBeginEditing(searchBar: UISearchBar) {      
        var barButton = UIBarButtonItem(title: "Button Title", style: UIBarButtonItemStyle.Done, target: self, action: "here")
        self.resultSearchController.searchBar.showsCancelButton = false
        self.resultSearchController.navigationItem.rightBarButtonItem = barButton
    }

但它不起作用。 請問你能幫幫我嗎?

嘗試使用 setValue 訪問按鈕文本,如下所示:

斯威夫特 4

searchController.searchBar.setValue("New Title", forKey: "cancelButtonText")

這個對我有用 :)

初始化搜索控制器后,將其放入視圖控制器的viewDidLoad()中。

UIBarButtonItem.appearance(whenContainedInInstancesOf: [UISearchBar.self]).title = "your button title"

對於斯威夫特 5

searchBar.delegate = 自我在此處輸入圖像描述

func searchBarTextDidBeginEditing(_ searchBar: UISearchBar) {
     let cBtn = searchBar.value(forKey: "cancelButton") as! UIButton
     cBtn.setTitle("MyCustomText", for: .normal)
}
func searchDisplayControllerWillBeginSearch(controller: UISearchDisplayController) {
    self.searchDisplayController?.searchBar.showsCancelButton = true
    var cancelButton: UIButton
    var topView: UIView = self.searchDisplayController?.searchBar.subviews[0] as UIView
    for subView in topView.subviews {
        if subView.isKindOfClass(NSClassFromString("UINavigationButton")) {
            cancelButton = subView as UIButton
            cancelButton.setTitle("Vazgeç", forState: UIControlState.Normal)
        }
    }
}

檢查這個答案

上面針對 Swift 5 更新的答案示例:

if let cancelButton = searchController.searchBar.value(forKey: "cancelButton") as? UIButton {
    cancelButton.setTitle(<your_string>, for: <UIControlState>)
    cancelButton.setTitleColor(<your_uicolor>, for: <UIControlState>)
    cancelButton.setAttributedTitle(<your_nsattributedstring>, for: <UIControlState>)
}

我通過在 UISearchBar 對象中找到 UIButton 指針來解決它。 我的項目中有 Objective-c 代碼,但你可以看到邏輯。

- (BOOL)searchBarShouldBeginEditing:(UISearchBar *)searchBar {

    [searchBar setShowsCancelButton:YES animated:YES];

    for (UIView *ob in ((UIView*)searchBar.subviews[0]).subviews) {
        if ([ob isKindOfClass:[UIButton class]]) {
            UIButton *btn = (UIButton*)ob;
            [btn setTitle:@"İptal" forState:UIControlStateNormal];
        }
    }
    return YES;
}

您必須搜索子視圖才能找到 UINavigationButton。

func findButton(in view: UIView, replace title: String) {
    for subview in view.subviews {
        if subview.isKind(of: NSClassFromString("UINavigationButton")!) {
            let cancelButton = subview as! UIButton
            cancelButton.setTitle(title, for: .normal)
            view.setNeedsLayout()
            break
        } else {
            findButton(in: subview, replace: title)
        }
    }
}

用法:

findButton(in: searchBar, replace: title)

首先,您需要在導航控制器中顯示自定義搜索欄按鈕,例如

在 ViewDidLoad()

self.searchDisplayController?.displaysSearchBarInNavigationBar = true

在委托方法中

func searchBarTextDidBeginEditing(searchBar: UISearchBar) {

    var barButton = UIBarButtonItem(title: "Button Title", style: UIBarButtonItemStyle.Done, target: self, action: "here")
    self.searchDisplayController?.navigationItem.rightBarButtonItem = barButton
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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