簡體   English   中英

更改 iOS 8 中的 UISearchBar 取消按鈕文本

[英]Change UISearchBar cancel button text in iOS 8

我想將 iOS 8 中UISearchBar內取消按鈕的文本從“取消”更改為“完成”。我正在使用UISearchController 我為 iOS 6 和 iOS 7 嘗試了不同的方法,但它們不起作用。 有沒有人做過這個?

目標-C:

[searchBar setValue:@"customString" forKey:@"_cancelButtonText"];

迅速:

searchBar.setValue("customString", forKey:"_cancelButtonText")

這在 ios8 到 ios13 中對我有用,在 ios7 中沒有嘗試,但應該可以解決問題,小心將此行放在應用程序周期的早期(例如:appDelegate)

[[UIBarButtonItem appearanceWhenContainedIn:[UISearchBar class], nil] setTitle:@"Annuler"];

從 ios9 開始,您還可以使用

[[UIBarButtonItem appearanceWhenContainedInInstancesOfClasses:@[[UISearchBar class]]] setTitle:@"Annuler"];

迅捷版:

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

希望有幫助;)

找到了!。 在 iOS 8 中,取消按鈕位於“cancelButton”鍵下。 我使用 UISearchBar 委托 searchBarTextDidBeginEditing 進行更改。

func searchBarTextDidBeginEditing(searchBar: UISearchBar) {
    let uiButton = searchBar.valueForKey("cancelButton") as UIButton
    uiButton.setTitle("Done", forState: UIControlState.Normal)

}

斯威夫特 3.0:

在您的AppDelegate 中添加以下內容:

UIBarButtonItem.appearance(whenContainedInInstancesOf: [UISearchBar.self]).title = "my text"
 for view in (UISearchBar.subviews[0]).subviews{
             if let button = view as? UIButton{
             button.setTitleColor(UIColor.whiteColor(), forState: .Normal)
             button.setTitle("Cancel", forState:.Normal)
            }
     }

self.subviews[0]).subviews 包含 UISearchBarBackground,UISearchBarTextField,UINavigationButto‌ n,其中 UINavigationButton 是 UIButton 的子類。檢查 View 作為 UIButton,如果是,則更改 UIButton 的屬性。

我很難讓它在 UISearchController 中為 UISearchBar 工作。 第一次顯示取消按鈕時,文本沒有改變,但第二次改變了。

直到我看到@ polo987 的回答。 這是我所做的工作:

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

對於 iOS 13 支持:

迅速:

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

目標 C:

    [[UIBarButtonItem appearanceWhenContainedInInstancesOfClasses:[NSArray arrayWithObject:[UISearchBar class]]] setTitle:@"Whatever"]

在斯威夫特:

searchBar.setValue("customString", forKey: "_cancelButtonText")

基於 Burhanuddin Sunelwala 的回答。

Swift4 中

更改標題:

(searchBar.value(forKey: "cancelButton") as! UIButton).setTitle("Done", for: .normal)

換顏色:

(searchBar.value(forKey: "cancelButton") as! UIButton).setTitleColor(UIColor.blue, for: .normal)

我已將 titleLabel.font 添加到組合中...

這直接進入我的 ViewDidLoad() {

        let searchFont = UIFont(name: "BrandonGrotesque-Medium", size: 12)
        let textFieldSearchBar = self.searchBar.valueForKey("searchField") as! UITextField
        textFieldSearchBar.font = searchFont
        let cancelButton = searchBar.valueForKey("cancelButton") as! UIButton
        cancelButton.setTitle("Done", forState: .Normal)
        cancelButton.titleLabel!.font = searchFont

斯威夫特4.2、4.0+

用於自定義搜索欄中最常見元素的自定義類。

class SearchBar: UISearchBar {

    private enum SubviewKey: String {
        case searchField, clearButton, cancelButton,  placeholderLabel
    }

    // Button/Icon images
    public var clearButtonImage: UIImage?
    public var resultsButtonImage: UIImage?
    public var searchImage: UIImage?

    // Button/Icon colors
    public var searchIconColor: UIColor?
    public var clearButtonColor: UIColor?
    public var cancelButtonColor: UIColor?
    public var capabilityButtonColor: UIColor?

    // Text
    public var textColor: UIColor?
    public var placeholderColor: UIColor?
    public var cancelTitle: String?

    // Cancel button to change the appearance.
    public var cancelButton: UIButton? {
        guard showsCancelButton else { return nil }
        return self.value(forKey: SubviewKey.cancelButton.rawValue) as? UIButton
    }

    override func layoutSubviews() {
        super.layoutSubviews()

        if let cancelColor = cancelButtonColor {
            self.cancelButton?.setTitleColor(cancelColor, for: .normal)
        }
        if let cancelTitle = cancelTitle {
            self.cancelButton?.setTitle(cancelTitle, for: .normal)
        }

        guard let textField = self.value(forKey: SubviewKey.searchField.rawValue) as? UITextField else { return }

        if let clearButton = textField.value(forKey: SubviewKey.clearButton.rawValue) as? UIButton {
            update(button: clearButton, image: clearButtonImage, color: clearButtonColor)
        }
        if let resultsButton = textField.rightView as? UIButton {
            update(button: resultsButton, image: resultsButtonImage, color: capabilityButtonColor)
        }
        if let searchView = textField.leftView as? UIImageView {
            searchView.image = (searchImage ?? searchView.image)?.withRenderingMode(.alwaysTemplate)
            if let color = searchIconColor {
                searchView.tintColor = color
            }
        }
        if let placeholderLabel =  textField.value(forKey: SubviewKey.placeholderLabel.rawValue) as? UILabel,
            let color = placeholderColor {
            placeholderLabel.textColor = color
        }
        if let textColor = textColor  {
            textField.textColor = textColor
        }
    }

    private func update(button: UIButton, image: UIImage?, color: UIColor?) {
        let image = (image ?? button.currentImage)?.withRenderingMode(.alwaysTemplate)
        button.setImage(image, for: .normal)
        button.setImage(image, for: .highlighted)
        if let color = color {
            button.tintColor = color
        }
    }
}

用法:

class ViewController: UIViewController {

    @IBOutlet private weak var searchBar: SearchBar!

    override func viewDidLoad() {
        super.viewDidLoad()

        searchBar.clearButtonColor      = .purple
        searchBar.cancelButtonColor     = .magenta
        searchBar.searchIconColor       = .red
        searchBar.placeholderColor      = .green
        searchBar.textColor             = .orange
        searchBar.capabilityButtonColor = .green
    }
}

結果: 在此處輸入圖片說明

我知道這似乎有點無關緊要,但在我看來,這比使用私有 api 更安全,也比潛入未知視圖更有效。 只有當您擁有自己的本地化引擎並且確實希望 Apple 在整個應用程序中遵循您的機制時,此解決方案才有意義。 基本上我的想法是通過更改 NSUserDefaults 中的“AppleLanguages”鍵來切換 iOS SDK 用於本地化按鈕的語言。 你可以去這里了解更多關於它是如何工作的信息。

[[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObjects:@"en", @"fr", nil] forKey:@"AppleLanguages"];
[[NSUserDefaults standardUserDefaults] synchronize];

無論手機上設置什么語言,都將此代碼使用英語本地化和法語后備。 這僅在應用程序內生效。

這是Swift解決方案:

for (view) in _searchController.searchBar.subviews {
    for (subview) in view.subviews {
        if (subview.isKindOfClass(UIButton.self)) {
            let cancelButton = subview as! UIButton
            cancelButton.setTitle("BlaBla", forState: .Normal)
            break
        }
    }
}

讓 uiButton = searchBar.value(forKey: "cancelButton") as! UIButton uiButton.setTitle(NSLocalizedString("Cancel", comment: ""), for: .normal)

暫無
暫無

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

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