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

45

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


可能是重复的问题:UISearchController更改“取消”按钮标题 - Praveen Gowda I V
我已经在这个主题下写了一个答案:https://dev59.com/YGIk5IYBdhLWcg3wgub-。只需使用SHSearchBar Cocoapod,它不像UISearchBar那样让人头疼。 - blackjacx
毫不犹豫地接受polo987的答案,因为它是迄今为止最干净的答案之一。 - Anton Tropashko
14个回答

88

Objective-C:

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

Swift:

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

@It_Does_Not_Matter 已更新! - Burhanuddin Sunelwala
这个不起作用。首先@符号会导致错误,当我删除它们后,会得到以下信息:" [<UISearchController 0x7fcb9173f160> setValue:forUndefinedKey:]:此类未为键值编码兼容键_cancelButtonText。" - rohaldb
更新了!你必须在 UISearchBar 上调用这个方法,而不是在 UISearchViewController 上调用。 - Burhanuddin Sunelwala
2
我认为这不是安全的证明。如果苹果公司决定在iOS更新中更改按钮的_cancelButtonText键,则会导致运行时崩溃。 - George Marmaridis
8
在 iOS 13 中,访问 UISearchBar 的 set_cancelButtonText: 实例变量是被禁止的,因此会导致崩溃。 - Casper Zandbergen
显示剩余3条评论

40

这在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"

希望这能帮到你 ;)


1
能够不使用任何黑科技,并且在 iOS13 系统上依然有效的最早答案。 - Anton Tropashko

20

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

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

}

5
考虑不在这个回调函数中设置按钮标题。这似乎有点奇怪和不必要。考虑在设置视图时设置此值。 - Steffen D. Sommer
1
比使用私有 _cancelButtonText 好100倍 - Leo
@SteffenD.Sommer 对我来说,在回调函数中设置它是有意义的,因为只有当UISearchBar处于焦点状态时,我才会显示取消按钮。 - toddg
4
@Leo说:“cancelButton”也是一个未记录的私有属性。下划线的缺失并不改变这一事实。 - jamesk
在iOS 11.0中,当第一次点击“取消”按钮时,无法设置。在第一次之后,文本会像上面所述发生变化。 - eemrah
@elia 如果还有意义的话,可以在viewWillAppear中将searchBar设置为firstResponder来实现。 - anamika41

14

Swift 3.0:

在你的AppDelegate中添加以下内容:

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

9
 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]中包含UISearchBarBackground、UISearchBarTextField和UINavigationButton,其中UINavigationButton是UIButton的子类。检查视图是否为UIButton,如果是,则更改UIButton的属性。


请使用[编辑]链接将此信息添加到您的帖子中。评论是“二等公民”,随时可能被删除。 - Jed Fox
这个答案对我来说几乎有效 - 我将代码放在 searchBarTextDidBeginEditing 中,并且它正确地更改了按钮的标题。但是,当“取消”按钮首次显示时,它没有起作用 - 我怀疑它比调用 searchBarTextDidBeginEditing 的时间晚了几秒钟。最终我在我的 viewDidLoad 方法中使用了 这个解决方案 - 完美解决! - MayaLekova

8

我在使用UISearchController中的UISearchBar时遇到了问题。第一次显示取消按钮时,文本没有改变,但第二次显示时却改变了。

直到我看到了@polo987的答案。这是我成功做到的:

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

适用于iOS 13+。 - Ahmadreza

8

针对iOS 13的支持:

Swift:

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

Objective-C:

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

6

在Swift中:

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

基于Burhanuddin Sunelwala的回答。


4
这是一个危险的解决方案。如果苹果更改名为“_cancelButtonText”的关键字,这将导致您的应用程序崩溃。 - Josh

6
在Swift4中:
更改标题:
(searchBar.value(forKey: "cancelButton") as! UIButton).setTitle("Done", for: .normal)
更改颜色:
(searchBar.value(forKey: "cancelButton") as! UIButton).setTitleColor(UIColor.blue, for: .normal)

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接