¿Cómo puedo cambiar el color del texto de un UISearchBar?

InformationsquelleAutor MrTourkos | 2015-02-13

12 Comentarios

  1. 85

    Para tener acceso a los UITextField dentro de la UISearchBar. Usted puede hacerlo mediante el uso de valueForKey("searchField")

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

    Swift 3 actualización

    let textFieldInsideSearchBar = yourSearchbar.value(forKey: "searchField") as? UITextField
    
    textFieldInsideSearchBar?.textColor = yourcolor
    • Gracias! Pero es que la API pública o privada?
    • Sí, es público.
    • No compilar. Después de un par de cambios que hizo, pero luego tiró un error de tiempo de ejecución de quejarse «de la Matriz de índice fuera de rango» y si lo puedo cambiar a la subvista[0] es un UIView que no se puede lanzar a un textField. Aviso que estoy usando Swift 1.2 si que tiene algo que ver. Gracias y lo siento por la respuesta tardía.
    • He editado mi respuesta. Usted puede tener acceso al campo utilizando valueforkey(«searchField»)
    • Ahora bien gran trabajo! A un menor de edad, usted tiene que desdoblar textFieldInsideSearchBar?.textColor = yourcolor para acceder a textColor Gracias hombre!
    • ¿Cómo encontrar el nombre de la searchField valor ? Me gustaría cambiar la fuente de en el botón cancelar, pero no encuentro el valor para ella.
    • no funciona en todos los —- Terminación de la aplicación debido a uncaught exception ‘NSUnknownKeyException’, la razón: ‘[<UITableView 0x1694bc00> valueForUndefinedKey:]: esta clase no es el valor de la clave de codificación compatible con la tecla de searchField.’
    • No es privado de la API, pero es muy frágil y se puede romper en cualquier actualización de iOS. Usted nunca debe usar cosas como estas en el código de producción
    • esta no es la API pública!!!
    • Has comprobado cuánto tiempo hace que esta respuesta fue publicado? Es posible que no funciona más. Siéntase libre de mostrar otro enfoque.
    • no importa cuando la respuesta original fue publicado, todavía se basa en la API privada. Si era pública, no necesita acceso searchField a través de KVC.
    • Downvote. Ver a @juanjo la respuesta de mi comentario de una forma mucho más sólido método aprobado por Apple y mucho menos probable que se rompa.
    • No use esta respuesta, tiene acceso privado y las Api de la que podría obtener de su aplicación rechazado.
    • stackoverflow.com/a/50487972/242769 es la respuesta correcta

  2. 50

    Si desea establecer el color del texto para UISearchBar en el guión gráfico (sin código), es fácil de hacer así (en la identidad del inspector). Aquí está el texto en rojo para la barra de búsqueda.

    ¿Cómo puedo cambiar el UISearchBar de búsqueda de texto de color?

    • Es mejor tener menos código para la visualización de los elementos. Gracias.
  3. 36

    De trabajo en Swift 4 para mí:

    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]
    • Trabajando para mí.
    • No funciona para mí iOS 12.1.2.
    • y cambiar el color de cada barra de búsquedas en el módulo?
  4. 35

    Si usted sólo necesita hacer es legible en un fondo oscuro puede cambiar el barStyle. El siguiente texto y los botones en la barra de búsquedas blanco:

    searchController.searchBar.barStyle = .black
    • gracias por la respuesta! Esto funcionó
    • Ayudó también! Gracias
  5. 29
    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
        }
    }
    • Si esto funciona muy bien! Gracias Adán.
    • Como la solución. Gracias.
  6. 10

    La forma más conveniente creo que es establecer un textColor propiedad en UISearchBar.

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

    Uso

    searchBar.textColor = UIColor.blue // Your color

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

    Que podría utilizarlo como:

    searchBar.textColor = UIColor.blueColor() // Your color
    • no funciona para mí. cuando se establece el textcolor propiedad?
    • puede configurar esta ‘viewDidLoad()’
    • Sí, yo quería cambiar el placholder el color del texto. Ahora he encontrado la solución. Gracias de todos modos
  7. 9

    Esto me funciona en iOS 11, Xcode 9:

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

    Lo escribo en el AppDelegate pero supongo que funciona si lo pones en algún otro lugar también.

    • Esta es mucho más robusta que la de clave-valor tonterías en la aceptación de respuesta y otras respuestas. Sin embargo, Apple en su sabiduría ha dejado de utilizar la API utilizada aquí y ofrece una nueva versión para iOS 9.0 y anteriores, así: [[UITextField appearanceWhenContainedInInstancesOfClasses:@[[UISearchBar class]]] setTextColor:[UIColor blueColor]]; Esto es, por supuesto, Objective-C, con traducción evidente para el uso de Swift appearance(whenContainedInInstancesOf:)
    • No parece trabajar para mí en Xcode 10, iOS 12, en un dispositivo real.
  8. 3

    Usted puede hacer esto mediante el acceso a la UITextField dentro de la barra de búsquedas,
    entonces usted puede cambiar su color de fondo, color de texto, y todos los demás UITextField propiedades

    agregar la siguiente extensión para acceder a la 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
        }
    }
  9. 1

    (Esta solución sólo probado para Xcode 10 & iOS 12.) Añadir una extensión para acceder a la barra de búsqueda del campo de texto:

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

    A continuación, utilizar esa propiedad para establecer el color del texto de campo de texto en la barra de búsqueda:

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

    En mi situación la solución es

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

    Aquí es un Xamarin.iOS la versión de C# de la «encontrar el UITextField» enfoque. No va a fallar si los UITextField desaparece en el futuro iOS vista de jerarquía.

    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;
            }
        }
    }
  12. 0

    Desde Xcode 11 y iOS 13, se ha hecho posible el acceso al campo de texto directamente:

    searchBar.searchTextField

    Podría escribir algo de código para siempre accesible como este.

    extension UISearchBar {
        public var textField: UITextField? {
            guard let firstSubview = subviews.first else {
                assertionFailure("Could not find text field")
                return nil
            }
    
            for view in firstSubview.subviews {
                if #available(iOS 13.0, *) {
                    return searchTextField
                } else {
                    if let textView = view as? UITextField {
                        return textView
                    }
                }
            }
    
            assertionFailure("Could not find text field")
    
            return nil
        }
    }

    También se podría hacer no es opcional con errores fatales, este código es probado desde iOS 7 hasta iOS 13b6. Pero acabo de ir para la versión opcional.

    extension UISearchBar {
        public var textField: UITextField {
            guard let firstSubview = subviews.first else {
                fatalError("Could not find text field")
            }
    
            for view in firstSubview.subviews {
                if #available(iOS 13.0, *) {
                    return searchTextField
                } else {
                    if let textView = view as? UITextField {
                        return textView
                    }
                }
            }
    
           fatalError("Could not find text field")
        }
    }

Dejar respuesta

Please enter your comment!
Please enter your name here