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