Я чувствую, что принимаю сумасшедшие таблетки. Я хочу изменить цвет текстового поля в UISearchBar, который размещен в UINavigationBar. У меня проблема в том, что UISearchBar получает цвет UINavigationBar, но TextField не меняет цвет. Я пробовал несколько решений здесь, но ни одно из них, похоже, не решает проблему. Есть идеи, как изменить цвет TextField?
Я знаю, что есть и другие вопросы, похожие на этот, но я перепробовал все возможные решения, с которыми сталкивался, и не нашел того, который решает мою проблему.
Текущий код:
let sc = UISearchController(searchResultsController: nil)
sc.delegate = self
let scb = sc.searchBar
scb.tintColor = UIColor.green
scb.barTintColor = UIColor.yellow
if let textfield = scb.value(forKey: "searchField") as? UITextField {
textfield.textColor = UIColor.blue
if let backgroundview = textfield.subviews.first {
// Background color
backgroundview.backgroundColor = UIColor.red
// Rounded corner
backgroundview.layer.cornerRadius = 5;
backgroundview.clipsToBounds = true;
}
}
navigationController?.navigationBar.barTintColor = UIColor.blue
navigationItem.searchController = sc
navigationItem.hidesSearchBarWhenScrolling = false
Я создал пример проекта, чтобы показать его в действии. Любая помощь или руководство будет принята с благодарностью!





Возможно, лучшим решением будет создание расширения для UISearchBar, если вы хотите использовать эти настройки в большем количестве контроллеров. Вот несколько примеров.
extension UISearchBar {
private func getViewElement<T>(type: T.Type) -> T? {
let svs = subviews.flatMap { $0.subviews }
guard let element = (svs.filter { $0 is T }).first as? T else { return nil }
return element
}
func getSearchBarTextField() -> UITextField? {
return getViewElement(type: UITextField.self)
}
func setTextColor(color: UIColor) {
if let textField = getSearchBarTextField() {
textField.textColor = color
}
}
func setTextFieldColor(color: UIColor) {
if let textField = getViewElement(type: UITextField.self) {
switch searchBarStyle {
case .minimal:
textField.layer.backgroundColor = color.cgColor
textField.layer.cornerRadius = 6
case .prominent, .default:
textField.backgroundColor = color
@unknown default:
print("something")
}
}
}
func setPlaceholderTextColor(color: UIColor) {
if let textField = getSearchBarTextField() {
textField.attributedPlaceholder = NSAttributedString(string: self.placeholder != nil ? self.placeholder! : "", attributes: [NSAttributedString.Key.foregroundColor: color])
}
}
func setTextFieldClearButtonColor(color: UIColor) {
if let textField = getSearchBarTextField() {
let button = textField.value(forKey: "clearButton") as! UIButton
if let image = button.imageView?.image {
button.setImage(image.transform(withNewColor: color), for: .normal)
}
}
}
func setSearchImageColor(color: UIColor) {
if let imageView = getSearchBarTextField()?.leftView as? UIImageView {
imageView.image = imageView.image?.transform(withNewColor: color)
}
}
}
Обновлять:
Замените navigationItem.searchController = sc на navigationItem.titleView = sc.searchBar.

Вы добавили UISearchBarDelegate в свой класс? class ViewController: UIViewController, UISearchBarDelegate
Да, и присвоил делегат самому себе, но я не вижу ничего связанного с пользовательским интерфейсом в методах делегата.
Обновите гит пожалуйста
Я вижу, вы добавили UISearchControllerDelegate в свой MasterViewController, но вы также добавили UISearchBarDelegate?
Сделанный. Спасибо :)
У меня сейчас оба там. Вы можете увидеть в последнем толчке.
Я изменил navigationItem.searchController = sc на navigationItem.titleView = sc.searchBar, и это работает для меня
Это действительно работает, вы просто теряете заголовок в компактном макете панели навигации, и он помещает заголовок под панелью поиска в макете большой панели навигации.
Та же проблема, я добавил расширение и установил свои цвета:
scb.setTextFieldColor(color: UIColor.green)scb.setTextColor(color: UIColor.red), и результатом по-прежнему является панель поиска с оттенком панели навигации.