如何更改UISearchBar搜索文本的颜色?


Answers:


108

您必须访问UITextFieldUISearchBar内部。您可以通过使用valueForKey("searchField")

var textFieldInsideSearchBar = yourSearchbar.valueForKey("searchField") as? UITextField

textFieldInsideSearchBar?.textColor = yourcolor

Swift 3更新

let textFieldInsideSearchBar = yourSearchbar.value(forKey: "searchField") as? UITextField

textFieldInsideSearchBar?.textColor = yourcolor

1
我已经编辑了答案。您可以使用valueforkey(“ searchField”)
Christian

7
它不是私有API,但非常脆弱,可以在任何iOS更新中中断。您不应该在生产代码中使用此类代码
Lope

2
@Christian-发布原始答案的时间并不重要,它仍然依赖于私有API。如果是公开的,则无需searchField通过KVC访问。
格雷格·布朗

1
下注。请参阅@juanjo的答案和我的评论,以获取Apple认可的更健壮的方法,并且破译的可能性很小。
RobP

1
不要使用此答案,因为您正在访问私有API,这可能会使您的应用程序被拒绝。
aryaxt

63

如果要在情节提要中为UISearchBar设置文本颜色(不使用代码),则也很容易做到(在身份检查器中)。这是搜索栏的红色文本。

在此处输入图片说明


2
最好为视图元素使用较少的代码。谢谢。
NRR

完美的解决方案!
莫娜

49

在Swift 4中为我工作:

UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).defaultTextAttributes = [NSAttributedStringKey.foregroundColor.rawValue: UIColor.white]

Swift 4.2,IOS 12:

UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).defaultTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.white]

为我工作。
Surjeet Rajput,

它会更改模块中每个搜索栏的颜色?
Zaporozhchenko Oleksandr,

48

如果只需要使其在深色背景上可读,则可以更改barStyle。以下内容使搜索栏中的文本和按钮变为白色:

searchController.searchBar.barStyle = .black

@培根,它也有帮助!谢谢
Goppinath

32
public extension UISearchBar {

    public func setTextColor(color: UIColor) {
        let svs = subviews.flatMap { $0.subviews }
        guard let tf = (svs.filter { $0 is UITextField }).first as? UITextField else { return }
        tf.textColor = color
    }
}

喜欢你的解决方案。谢谢。
Bagusflyer

您还可以添加“ searchField.backgroundColor”以控制文本颜色的背景颜色(与条形图分开)。
舍温·扎德

13

这适用于我在iOS 11,Xcode 9上:

UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).textColor = UIColor.blue

我在中写了它,AppDelegate但是如果您也将它放在其他地方,我想它也会起作用。


3
这比接受的答案和其他答案中的键值无意义要强得多。但是,Apple明智地弃用了您在此使用的API,并为iOS 9.0及更高版本提供了一个新版本,例如:[[UITextField appearanceWhenContainedInInstancesOfClasses:@[[UISearchBar class]]] setTextColor:[UIColor blueColor]];这当然是Objective-C,显然使用Swift进行了翻译appearance(whenContainedInInstancesOf:)
RobP,2018年

2
在实际设备上的Xcode 10,iOS 12中,似乎不适用于我。
Oded

10

我认为最方便的方法是在中设置textColor属性UISearchBar

斯威夫特3.0

    extension UISearchBar {

       var textColor:UIColor? {
           get {
               if let textField = self.value(forKey: "searchField") as? 
   UITextField  {
                   return textField.textColor
               } else {
                   return nil
               }
           }

           set (newValue) {
               if let textField = self.value(forKey: "searchField") as? 
   UITextField  {
                   textField.textColor = newValue
               }
           }
       }
   }

用法

searchBar.textColor = UIColor.blue // Your color

迅捷2.3

extension UISearchBar {

 var textColor:UIColor? {
     get {
         if let textField = self.valueForKey("searchField") as? UITextField  {
             return textField.textColor
         } else {
             return nil
         }
     }

     set (newValue) {
         if let textField = self.valueForKey("searchField") as? UITextField  {
             textField.textColor = newValue
         }
     }
 }
} 

您可以将其用作:

searchBar.textColor = UIColor.blueColor() // Your color

不为我工作。什么时候设置textcolor属性?
Kingalione

1
@Kingalione,您可以在“ viewDidLoad()”中设置它
Tal Zion

是的,我想更改placholder文本的颜色。现在我找到了解决方案。无论如何
Kingalione

10

从Xcode 11和iOS 13开始,可以直接访问文本字段:

searchBar.searchTextField

您可以编写一些代码以使其始终可访问,如下所示。

extension UISearchBar {
    public var textField: UITextField? {
        if #available(iOS 13.0, *) {
            return searchTextField
        } 

        guard let firstSubview = subviews.first else {
            assertionFailure("Could not find text field")
            return nil
        }

        for view in firstSubview.subviews {
            if let textView = view as? UITextField {
                return textView
            }
        }

        assertionFailure("Could not find text field")

        return nil
    }
}

您也可以将其设置为带有致命错误的非可选选项,此代码自iOS 7到iOS 13GM均经过测试。但是我只会选择可选版本。

extension UISearchBar {
    public var textField: UITextField {
        if #available(iOS 13.0, *) {
            return searchTextField
        }

        guard let firstSubview = subviews.first else {
            fatalError("Could not find text field")
        }

        for view in firstSubview.subviews {
            if let textView = view as? UITextField {
                return textView
            }
        }

       fatalError("Could not find text field")
    }
}

最后!我们可以直接访问文本字段。谢谢,莎伦。
Mark Moeykens

4

试试这个,

searchBar.searchTextField.textColor = .white

我将此与面向iOS 11的应用一起使用。

[更新]我观察到,该应用程序在较旧的版本(<iOS 13)上崩溃,但是编译器从未抱怨过版本检查,请有人解释为什么会发生这种情况。


3

您可以通过访问searchBar内的UITextField来执行此操作,然后可以更改其背景颜色,文本颜色和所有其他UITextField属性

添加以下扩展名以访问textField

extension UISearchBar {
    /// Return text field inside a search bar
    var textField: UITextField? {
        let subViews = subviews.flatMap { $0.subviews }
        guard let textField = (subViews.filter { $0 is UITextField }).first as? UITextField else { return nil
        }
        return textField
    }
}

3

我尝试了上面写的一些解决方案,但是它们没有用(我想还是可以了)。

如果您只想处理iOS 13:

mySearchBar.searchTextField.textColor = .red

但是,如果您也想处理较旧的iOS,这就是我的方法:

创建一个UISearchBar名为SearchBar : UISearchBar, UISearchBarDelegate This的自定义类,SearchBar它将包含UISearchBarDelegate我要处理的方法及其delegate设置。

我添加到该类中:

    var textField: UITextField? {
        if #available(iOS 13.0, *) {
            return self.searchTextField
        }
        return subviews.first?.subviews.first(where: { $0 as? UITextField != nil }) as? UITextField
    }

简短说明:

现在,使用iOS13,您可以访问的UITextField感谢UISearchBar.searchTextField类型UISearchTextField,该类型的继承自UITextField

因为我知道自己的层次结构,所以我知道我textField不会使用nill较旧的版本,因此在两种情况下,我都可以轻松定制一个文本域,适用于从9到13的每个版本。

这是使其工作所需的完整代码:


class SearchBar: UISearchBar, UISearchBarDelegate {

    var textField: UITextField? {
        if #available(iOS 13.0, *) {
            return self.searchTextField
        }
        return subviews.first?.subviews.first(where: { $0 as? UITextField != nil }) as? UITextField
    }


    override func awakeFromNib() {
        super.awakeFromNib()

        delegate = self

        if let textField = textField {
            textField.textColor = .red
            textField.clearButtonMode = .whileEditing
            textField.returnKeyType = .search
        }
    }

}

您还可以SearchBar通过在上添加一些自定义设置:

        let searchBar = UISearchBar.appearance(whenContainedInInstancesOf: [SearchBar.self])
        searchBar.backgroundImage = UIImage()
        searchBar.isTranslucent = false
        searchBar.returnKeyType = .search

然后将其设置到XIB / Storyboard,然后像处理简单一样处理它UISearchBar(如果您没有忘记委托!)。


2

(此解决方案仅针对Xcode 10和iOS 12进行了测试。)添加扩展名以访问搜索栏的文本字段:

extension UISearchBar {
    var textField: UITextField? {
        return subviews.first?.subviews.compactMap { $0 as? UITextField }.first
    }
}

然后使用该属性在搜索栏中设置文本字段的文本颜色:

let searchBar = UISearchBar()
searchBar.textField?.textColor = UIColor.white // or whichever color you want

//编辑

上面的代码不适用于iOS13。解决此问题的更好方法是使用:

extension UISearchBar {
    var textField: UITextField? {
        return self.subviews(ofType: UITextField.self).first
    }
}

extension UIView {
    var recursiveSubviews: [UIView] {
        return self.subviews + self.subviews.flatMap { $0.recursiveSubviews }
    }

    func subviews<T: UIView>(ofType: T.Type) -> [T] {
        return self.recursiveSubviews.compactMap { $0 as? T }
    }
}

对于iOS 13 返回subviews.first?.subviews.last?.subviews.compactMap {$ 0 as?UITextField} .last
Taras

2

//尝试这个家伙

yourSearchbar.searchTextField.textColor = .white

1

这是“查找UITextField”方法的Xamarin.iOS C#版本。如果UITextField在将来的iOS视图层次结构中消失,它将不会崩溃。

var tf = searchBar.AllSubViews().FirstOrDefault(v => v is UITextField);
if (tf != null) 
    (tf as UITextField).TextColor = UIColor.White;

public static IEnumerable<UIView> AllSubViews(this UIView view)
{
    foreach (var v in view.Subviews)
    {
        yield return v;
        foreach (var sv in v.AllSubViews())
        {
            yield return sv;
        }
    }
}

1

Swift 5.2和iOS 13.3.1:-

它工作正常。

UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).defaultTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.white]


0

在我的情况下解决方案是

id appearance = [UITextField appearanceWhenContainedInInstancesOfClasses:@[UISearchBar.class, BCRSidebarController.class]];
[appearance setTextColor:[UIColor.whiteColor colorWithAlphaComponent:0.56]];

0

对象

UITextField *textField = [self.yourSearchbar valueForKey:@"_searchField"];
textField.textColor = [UIColor redColor];

斯威夫特4.x

let textField = yourSearchbar.value(forKey: "searchField") as? UITextField
textField?.textColor = UIColor.red

0

斯威夫特5:

searchBar[keyPath: \.searchTextField].textColor = UIColor(...)


0

在Swift 5中,您可以执行以下操作:

yourSearchBar.searchTextField.textColor = .yourColor

0

这对我有用。

    if #available(iOS 13.0, *) {
     searchBar.searchTextField.textColor = .white
    }

-1

Swift 5 Xcode 11.4 iOS 13.4

    UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).textColor = .white
    UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).font = .systemFont(ofSize: 13)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.