在 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 已更新! 这不起作用。首先,@ 符号会导致错误,当我删除它们时,我得到以下信息:“[_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,UINavigationButton 其中 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的取消按钮颜色?
如何在iOS7中更改UISearchBar的取消按钮的textColor?
如何在 iOS7 中更改 UISearchBar 的 inputView?