44

UISearchBariOS 8の 内のキャンセル ボタンのテキストを「キャンセル」から「完了」に変更したいと思います。使用してUISearchControllerいます。iOS 6 と iOS 7 でさまざまなアプローチを試しましたが、うまくいきません。誰もこれをやったことがありますか?

4

14 に答える 14

88

目的 C:

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

迅速:

searchBar.setValue("customString", forKey:"_cancelButtonText")
于 2015-03-25T10:51:53.883 に答える
38

これは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"

それが役立つことを願っています;)

于 2015-12-30T02:32:16.410 に答える
20

それを見つけた!。iOS 8 では、キャンセル ボタンはキー「cancelButton」の下にあります。UISearchBar デリゲート searchBarTextDidBeginEditing を使用して変更を加えました。

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

}
于 2015-03-24T12:05:16.823 に答える
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]).subviews には、UISearchBarBackground、UISearchBarTextField、UINavigationButton が UIButton のサブクラスである UINavigationButton が含まれています。View を UIButton としてチェックし、そうであれば UIButton のプロパティを変更します。

于 2016-10-28T12:52:13.307 に答える
8

UISearchController 内の UISearchBar でこれを機能させるのに問題がありました。最初にキャンセル ボタンが表示されたときはテキストは変更されませんでしたが、2 回目は変更されました。

それは@ polo987の答えを見るまでです。これが私がやったことです:

UIBarButtonItem.appearance(whenContainedInInstancesOf: [UISearchBar.self]).title = "Done"
于 2016-05-10T22:14:31.290 に答える
6

Swift4

タイトルを変更:

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

色を変える:

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

于 2017-10-25T15:45:45.077 に答える
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
于 2016-04-07T04:32:19.313 に答える
3

スウィフト 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
    }
}

結果: ここに画像の説明を入力

于 2018-07-16T06:20:06.930 に答える
2

これは少し無関係に思えるかもしれませんが、私の意見では、これはプライベート API を使用するよりも安全であり、未知のビューに飛び込むよりも効率的です。このソリューションは、独自のローカリゼーション エンジンを持っていて、アプリ全体で Apple に独自のメカニズムに従ってもらいたい場合にのみ意味があります。基本的に私の考えは、NSUserDefaults の「AppleLanguages」キーを変更して、iOS SDK がボタンをローカライズするために使用する言語を切り替えることです。この仕組みの詳細については、こちらを参照してください。

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

電話に設定されている言語に関係なく、英語のローカライズとフランス語のフォールバックを使用するには、このコードを挿入します。これはアプリ内でのみ有効です。

于 2016-08-23T14:35:34.810 に答える