求助:使用NSAttributedString修改UISearchController搜索栏占位符颜色失败
解决UISearchController搜索栏占位符颜色无法修改的问题
我之前也踩过这个坑,UISearchBar的内部组件有时候会被系统悄悄重置属性,导致咱们手动设置的样式不生效,给你几个实测有效的解决方向:
1. 切换到更早的生命周期方法设置
把你的配置代码从viewDidAppear移到viewWillAppear(_:)里试试——viewDidAppear触发时,搜索栏可能已经完成初始渲染了,咱们的设置就晚了一步:
override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) configSearchBarStyle() } private func configSearchBarStyle() { let searchTextField = searchController.searchBar.searchTextField searchTextField.textColor = .black searchTextField.attributedPlaceholder = NSAttributedString(string: "Search", attributes: [NSAttributedString.Key.foregroundColor : UIColor.black]) searchTextField.leftView?.tintColor = .darkGray }
2. 用UIAppearance强制锁定样式
如果上面的方法还是没效果,可以通过外观代理来全局或局部固定样式,能避开系统的自动重置:
// 可以放在AppDelegate的didFinishLaunchingWithOptions,或者当前ViewController的init方法里 let searchFieldAppearance = UISearchTextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]) searchFieldAppearance.textColor = .black searchFieldAppearance.attributedPlaceholder = NSAttributedString(string: "Search", attributes: [.foregroundColor: UIColor.black]) searchFieldAppearance.leftView?.tintColor = .darkGray
如果只想给当前这个搜索栏生效,也可以直接针对它的searchTextField单独配置外观。
3. 排查是否有代码覆盖了你的设置
有时候可能在其他逻辑里(比如搜索控制器的回调、或者某个延迟执行的方法),又重新设置了搜索栏的属性,把咱们的样式覆盖了。可以全局搜一下searchBar相关的代码,看看有没有冲突的配置。
4. 适配低iOS版本(如果需要)
如果你的项目需要兼容iOS 13以下的版本,直接访问searchTextField是无效的,得通过KVC获取内部的文本框:
if #available(iOS 13.0, *) { let searchTextField = searchController.searchBar.searchTextField // 执行样式设置 } else { if let searchTextField = searchController.searchBar.value(forKey: "_searchField") as? UITextField { searchTextField.textColor = .black searchTextField.attributedPlaceholder = NSAttributedString(string: "Search", attributes: [.foregroundColor: UIColor.black]) searchTextField.leftView?.tintColor = .darkGray } }
建议先试第一种方法,大部分情况下把设置时机提前到viewWillAppear就能解决问题,如果不行再依次尝试后面的方案。
内容的提问来源于stack exchange,提问作者johnyeocx
相关产品推荐
相关产品推荐

