UISearchController的searchTextField文字颜色修改不生效如何解决?
原因说明
UISearchBar在状态切换(激活/失活)、布局更新时会内部重置searchTextField的属性,如果你项目中有全局UINavigationBar、UISearchBar的外观配置,或者自定义了导航栏样式,很容易覆盖你手动设置的textColor,导致初始化时的赋值不生效。
更合理的解决方案
- 方案1:在视图布局完成后赋值
在持有UISearchController的ViewController中重写viewDidLayoutSubviews方法,每次布局更新后重新设置textColor,无需额外设置代理:
override func viewDidLayoutSubviews() { super.viewDidLayoutSubviews() searchController.searchBar.searchTextField.textColor = .red }
如果多页面复用,可以自定义UISearchBar子类,在子类的layoutSubviews中统一设置。
- 方案2:精准配置UIAppearance
外观配置需要在控件初始化之前执行才会生效,建议放在AppDelegate启动阶段或者对应页面初始化前的全局配置位置,可指定仅在当前类生效避免全局污染:
// 仅作用于当前ViewController下的UISearchBar内的UITextField UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self, YourTargetViewController.self]).textColor = .red
- 方案3:设置typingAttributes
除了直接设置textColor,还可以指定输入时的文本属性,同时支持自定义字体、行高等其他样式,同时兼容占位符颜色配置:
// 设置输入文本属性 searchController.searchBar.searchTextField.typingAttributes = [ .foregroundColor: UIColor.red, .font: UIFont.systemFont(ofSize: 16) ] // 如需修改占位符颜色可加这行 searchController.searchBar.searchTextField.attributedPlaceholder = NSAttributedString( string: "搜索", attributes: [.foregroundColor: UIColor.red.withAlphaComponent(0.6)] )
你当前用代理设置的方法本身也可以正常工作,只是多页面复用时需要重复写代理逻辑,以上方案复用性更强。
内容的提问来源于stack exchange,提问作者Kamen Dobrev
相关产品推荐
相关产品推荐

