在 iOS 8 中更改 UISearchBar 取消按钮文本

Posted

技术标签:

【中文标题】在 iOS 8 中更改 UISearchBar 取消按钮文本【英文标题】:Change UISearchBar cancel button text in iOS 8 【发布时间】:2015-03-11 15:32:38 【问题描述】:

我想在 ios 8 中将 UISearchBar 内的“取消”按钮的文本从“取消”更改为“完成”。我正在使用 UISearchController。我为 iOS 6 和 iOS 7 尝试了不同的方法,但它们不起作用。有人做过吗?

【问题讨论】:

UISearchController change 'Cancel' button title 的可能重复项 我在这里写了一个关于这个话题的答案:***.com/questions/19206757/…。只需使用 SHSearchBar Cocoapod,它不像 UISearchBar 那样让人头疼。 不要犹豫,接受 polo987 的回答,这是迄今为止最清楚的回答。 【参考方案1】:

目标-C:

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

斯威夫特:

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

【讨论】:

你有 Swift 版本吗? @It_Does_Not_Matter 已更新! 这不起作用。首先,@ 符号会导致错误,当我删除它们时,我得到以下信息:“[ setValue:forUndefinedKey:]: 这个类不符合键 _cancelButtonText 的键值编码。” 我认为这不是安全的证明。如果 Apple 决定通过 iOS 更新更改按钮的 _cancelButtonText 键,这将导致运行时崩溃。 这在 iOS 13 中崩溃。Access to UISearchBar's set_cancelButtonText: ivar is prohibited.【参考方案2】:

这在 ios8 到 ios13 中对我有用,在 ios7 中没有尝试过,但应该可以解决问题,注意不要将这一行放在应用程序周期的早期(例如:appDelegate)

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

从 ios9 开始你也可以使用

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

Swift 版本:

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

希望有所帮助;)

【讨论】:

最早的没有破解的答案,一直存在到 ios13。【参考方案3】:

找到了!在 iOS 8 中,取消按钮位于“cancelButton”键下方。我使用 UISearchBar 委托 searchBarTextDidBeginEditing 进行更改。

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


【讨论】:

我会考虑不在此回调中设置按钮标题。这似乎有点奇怪和不必要。在设置视图时考虑设置此值。 比使用私人_cancelButtonText 好100倍 @SteffenD.Sommer 在回调中设置它对我来说很有意义,因为在 UISearchBar 成为焦点之前我不会显示取消按钮。 @Leo: cancelButton 也是无证私有财产。没有下划线并不会改变这一点。 在iOS 11.0中第一次点击Cancel按钮时无法设置。在第一次之后,文本如上所示发生变化。【参考方案4】:

Swift 3.0:

在您的 AppDelegate 中添加:

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

【讨论】:

【参考方案5】:
 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 as UIButton 如果是则更改 UIButton 的属性。

【讨论】:

请使用edit 链接将此信息添加到您的帖子中。评论是“二等公民”,可以随时删除。 这个答案几乎对我有用——我把代码放在searchBarTextDidBeginEditing 中,它正确地改变了按钮的标题。但第一次显示“取消”按钮时它没有工作 - 我怀疑它是在调用 searchBarTextDidBeginEditing 之后几分钟创建的。我最终在我的viewDidLoad 方法中使用了this solution - 就像一个魅力!【参考方案6】:

我无法让它为 UISearchController 中的 UISearchBar 工作。第一次显示取消按钮时文本没有更改,但第二次显示时发生了变化。

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

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

【讨论】:

适用于 iOS 13+【参考方案7】:

对于 iOS 13 支持:

斯威夫特:

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

目标 C:

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

【讨论】:

【参考方案8】:

在斯威夫特中:

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

基于 Burhanuddin Sunelwala 的回答。

【讨论】:

这是一个危险的解决方案。如果苹果更改键“_cancelButtonText”的名称,这将导致您的应用程序崩溃。【参考方案9】:

Swift4

更改标题:

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

改变颜色:

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

【讨论】:

【参考方案10】:

我已将 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

【讨论】:

【参考方案11】:

斯威夫特 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
    

结果:

【讨论】:

【参考方案12】:

我知道这似乎有点无关紧要,但我认为这比使用私有 api 更安全,也比潜入未知视图更有效。仅当您拥有自己的本地化引擎并且确实希望 Apple 在整个应用程序中遵循您的机制时,此解决方案才有意义。 基本上我的想法是通过更改 NSUserDefaults 中的“AppleLanguages”键来切换 iOS SDK 用于本地化按钮的语言。您可以前往here 了解有关其工作原理的更多信息。

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

无论手机上设置什么语言,都可以将此代码使用英语本地化和法语后备。这仅在应用内生效。

【讨论】:

【参考方案13】:

这里是 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
        
    

【讨论】:

【参考方案14】:

让 uiButton = searchBar.value(forKey: "cancelButton") as!用户界面按钮 uiButton.setTitle(NSLocalizedString("Cancel", comment: ""), for: .normal)

【讨论】:

以上是关于在 iOS 8 中更改 UISearchBar 取消按钮文本的主要内容,如果未能解决你的问题,请参考以下文章

如何在iOS 7中更改文本UISearchBar的取消按钮颜色?

在 iOS 9+ 中更改 UISearchBar 文本颜色

如何在iOS7中更改UISearchBar的取消按钮的textColor?

如何在 iOS7 中更改 UISearchBar 的 inputView?

如何在 iOS7 中更改 UISearchBar 的背景颜色

如何在iOS上更改UISearchBar组件的内部背景颜色