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

Ios 如何更改UISearchBar搜索文本的颜色?,ios,swift,uisearchbar,Ios,Swift,Uisearchbar,如何更改UISearchBar的文本颜色?您必须访问UISearchBar内的UITextField。您可以使用valueForKey(“searchField”) Swift 3更新 searchBar.textColor = UIColor.blue // Your color 如果您想在故事板中为UISearchBar设置文本颜色(无代码),也很容易(在identity inspector中)。这里是搜索栏的红色文本 您可以通过访问搜索栏中的UITEXT字段来完成此操作, 然后可以更改其

如何更改
UISearchBar
的文本颜色?

您必须访问UISearchBar内的
UITextField
。您可以使用
valueForKey(“searchField”)

Swift 3更新

searchBar.textColor = UIColor.blue // Your color

如果您想在故事板中为UISearchBar设置文本颜色(无代码),也很容易(在identity inspector中)。这里是搜索栏的红色文本


您可以通过访问搜索栏中的UITEXT字段来完成此操作, 然后可以更改其背景色、文本颜色和所有其他UITextField属性

添加以下扩展名以访问文本字段

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
    }
}

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

Swift 3.0

用法

searchBar.textColor = UIColor.blue // Your color
Swift 2.3

您可以将其用作:

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

这在iOS 11、Xcode 9上适用:

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

我把它写在AppDelegate中,但我想如果你把它放在别的地方也行。

如果你只需要让它在黑暗的背景下可读,你可以改变barStyle。以下内容使搜索栏中的文本和按钮变为白色:

searchController.searchBar.barStyle = .black

在我的情况下,解决办法是

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

在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]
(此解决方案仅针对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
//编辑

上述代码不适用于iOS 13。处理此问题的更好方法是使用:

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 }
    }
}
扩展UISearchBar{ var textField:UITextField{ 返回self.subview(类型:UITextField.self) } } 扩展UIView{ var recursiveSubviews:[UIView]{ 返回self.subviews+self.subviews.flatMap{$0.recursiveSubviews} } func子视图(类型:T.Type)->[T]{ 返回self.recursiveSubviews.compactMap{$0 as?T} } } 这里是Xamarin.iOS C#版本的“查找UITextField”方法。如果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;
        }
    }
}
var tf=searchBar.AllSubViews().FirstOrDefault(v=>v是UITextField);
如果(tf!=null)
(tf作为UITextField.TextColor=UIColor.White;
公共静态IEnumerable AllSubView(此UIView)
{
foreach(视图中的var v.子视图)
{
收益率v;
foreach(v.allsubview()中的var sv)
{
收益率sv;
}
}
}

自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")
    }
}
Obj-C

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

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

我尝试了上面写的一些解决方案,但它们都不起作用(我想是再也不起作用了)

如果您只想处理iOS 13:

mySearchBar.searchTextField.textColor=.red

但如果你也想处理旧版iOS,我的做法如下:

创建一个名为
SearchBar的自定义
UISearchBar
类:UISearchBar,UISearchBarDelegate
搜索栏
将设置我要处理的
UISearchBarDelegate
方法及其
委托

我在课堂上增加了:

    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
,所以在这两种情况下,我都可以很容易地自定义一个textField,从现在的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/故事板,然后像处理简单的
UISearchBar一样处理它(如果您没有忘记代理!)。

//试试这个家伙

yourSearchbar.searchTextField.textColor = .white
试试这个

searchBar.searchTextField.textColor = .white
我正在将此应用程序用于iOS 11以后的目标应用程序

[更新]
我观察到,应用程序在旧版本(Swift 5.2和ios13.1:-

它很好用

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


Swift 5:


searchBar[keyPath:\.searchTextField].textColor=UIColor(…)
swift5xcode 11.4ios13.4

    UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).textColor = .white
    UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).font = .systemFont(ofSize: 13)

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

yourSearchBar.searchTextField.textColor = .yourColor
这对我有用

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

我已经编辑了我的答案。您可以使用valueforkey(“searchField”)访问该字段。它不是私有API,但非常脆弱,在任何iOS更新中都可能中断。你不应该在生产中使用这样的东西code@Christian-原始答案何时发布并不重要,它仍然依赖于私有API。如果它是公共的,您就不需要通过KVC.Downvote访问
searchField
。请参阅@juanjo的答案和我的评论,以了解苹果批准的更为稳健的方法,并且不太可能破坏。不要使用此答案,你正在访问私有API,这可能会导致你的应用被拒绝。最好减少视图元素的代码。谢谢。完美的解决方案!喜欢你的解决方案。谢谢。您还可以添加“searchField.backgroundColor”来控制文本字段的背景色,使其与条色分开。不适用于我。什么时候设置textcolor属性?@Kingalione您可以在“viewDidLoad()”中设置。是的,我想更改标语牌的文本颜色。现在我找到了解决办法。谢谢anyway@Bacon,这也有帮助!感谢这是一种比公认答案和其他答案中的关键价值观更为稳健的方法。然而,在他们的智慧中,苹果公司已经做到了
UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).defaultTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.white]

    UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).textColor = .white
    UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).font = .systemFont(ofSize: 13)
yourSearchBar.searchTextField.textColor = .yourColor
    if #available(iOS 13.0, *) {
     searchBar.searchTextField.textColor = .white
    }