Come posso modificare il colore del testo di ricerca di UISearchBar?


Risposte:


108

Devi accedere UITextFieldall'interno della UISearchBar. Puoi farlo usandovalueForKey("searchField")

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

textFieldInsideSearchBar?.textColor = yourcolor

Aggiornamento Swift 3

let textFieldInsideSearchBar = yourSearchbar.value(forKey: "searchField") as? UITextField

textFieldInsideSearchBar?.textColor = yourcolor

1
Ho modificato la mia risposta. È possibile accedere al campo utilizzando valueforkey ("searchField")
— Christian

7
Non è un'API privata ma è molto fragile e può rompersi con qualsiasi aggiornamento iOS. Non dovresti mai usare cose come queste nel codice di produzione
— Lope

2
@Christian - non importa quando è stata pubblicata la risposta originale, si basa ancora su API private. Se fosse pubblico, non sarebbe necessario accedere searchFieldtramite KVC.
— Greg Brown,

1
Downvote. Vedi la risposta di @ juanjo e il mio commento per un approccio molto più robusto approvato da Apple e molto meno probabile che si rompa.
— Rapina

1
Non utilizzare questa risposta, stai accedendo ad API private e la tua app potrebbe essere rifiutata.
— aryaxt

64

Se vuoi impostare il colore del testo per UISearchBar nello storyboard (senza codice), è facile farlo anche (nell'ispettore di identità). Ecco un testo rosso per la barra di ricerca.

inserisci qui la descrizione dell'immagine


2
È meglio avere meno codice per gli elementi di visualizzazione. Grazie.
— NRR

Soluzione perfetta!
— Mona

50

Lavorare in Swift 4 per me:

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]

Lavorando per me.
— Surjeet Rajput

e cambia colore per ogni barra di ricerca nel modulo?
— Zaporozhchenko Oleksandr

48

Se hai solo bisogno di renderlo leggibile su uno sfondo scuro puoi cambiare barStyle. Quanto segue rende bianchi il testo e i pulsanti nella barra di ricerca:

searchController.searchBar.barStyle = .black

@ Bacon, ha aiutato anche! Grazie
— Goppinath

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

Come la tua soluzione. Grazie.
— Bagusflyer

Puoi anche aggiungere "searchField.backgroundColor" per controllare il colore di sfondo del campo di testo separatamente dalla tinta della barra.
— Sherwin Zadeh

14

Questo funziona per me su iOS 11, Xcode 9:

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

Lo scrivo in AppDelegatema immagino che funzioni anche se lo metti da qualche altra parte.


3
Questo è un approccio molto più solido rispetto all'assurdità del valore-chiave nella risposta accettata e in altre risposte. Tuttavia, Apple nella loro saggezza ha deprecato l'API che usi qui e offre una nuova versione per iOS 9.0 e versioni successive, in questo modo: [[UITextField appearanceWhenContainedInInstancesOfClasses:@[[UISearchBar class]]] setTextColor:[UIColor blueColor]];Questo è ovviamente Objective-C, con ovvia traduzione in Swift usandoappearance(whenContainedInInstancesOf:)
— RobP

2
Non sembra funzionare per me in Xcode 10, iOS 12, su un dispositivo reale.
— Oded

11

Da Xcode 11 e iOS 13 è diventato possibile accedere direttamente al campo di testo:

searchBar.searchTextField

Potresti scrivere del codice per renderlo sempre accessibile in questo modo.

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

Potresti anche renderlo non opzionale con errori fatali, questo codice è testato da iOS 7 fino a iOS 13GM. Ma preferirei solo la versione opzionale.

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

Finalmente! Possiamo accedere direttamente al campo di testo. Grazie, Saren.
— Mark Moeykens

10

Il modo più conveniente secondo me è impostare una textColorproprietà 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
               }
           }
       }
   }

Utilizzo

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

Lo useresti come:

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

non funziona per me. quando imposti la proprietà textcolor?
— Kingalione

1
@Kingalione puoi impostare questo in 'viewDidLoad ()'
— Tal Zion

Sì, volevo cambiare il colore del testo del placholder. Adesso ho trovato le soluzioni. Grazie comunque
— Kingalione

5

Prova questo,

searchBar.searchTextField.textColor = .white

Lo sto usando con l'app mirata a iOS 11 in poi.

[Aggiornamento] Ho notato che l'app si arresta in modo anomalo nelle versioni precedenti (<iOS 13), ma il compilatore non si è mai lamentato del controllo della versione, qualcuno spiega perché è successo.


3

Puoi farlo accedendo a UITextField all'interno della searchBar, quindi puoi cambiare il suo colore di sfondo, il colore del testo e tutte le altre proprietà di UITextField

aggiungi la seguente estensione per accedere al 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
    }
}

3

Ho provato alcune delle soluzioni scritte sopra ma non hanno funzionato (più, immagino).

Se vuoi gestire solo iOS 13:

mySearchBar.searchTextField.textColor = .red

Ma se vuoi gestire anche iOS meno recenti, ecco come ho fatto:

Crea una UISearchBarclasse personalizzata , chiamata SearchBar : UISearchBar, UISearchBarDelegate This SearchBaravrà i UISearchBarDelegatemetodi che voglio gestire e il suo delegateset.

E aggiungo alla classe:

    var textField: UITextField? {
        if #available(iOS 13.0, *) {
            return self.searchTextField
        }
        return subviews.first?.subviews.first(where: { $0 as? UITextField != nil }) as? UITextField
    }

Breve spiegazione:

Con iOS13 ora, puoi accedere al UITextFieldringraziamento a UISearchBar.searchTextField, che è di tipo UISearchTextField, che eredita daUITextField .

Poiché conosco la mia gerarchia, so textFieldche non sarà nillper le versioni precedenti, quindi in entrambi i casi ottengo un campo di testo che posso facilmente personalizzare, lavorando su ogni versione, dalla 9 alla 13 di oggi.

Ecco il codice completo necessario per farlo funzionare:


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

}

Puoi anche impostare alcune personalizzazioni SearchBaraggiungendo questo su:

        let searchBar = UISearchBar.appearance(whenContainedInInstancesOf: [SearchBar.self])
        searchBar.backgroundImage = UIImage()
        searchBar.isTranslucent = false
        searchBar.returnKeyType = .search

Quindi lo imposti su XIB / Storyboard e lo gestisci come se fosse un semplice UISearchBar(se non hai dimenticato i delegati!).


2

(Questa soluzione è stata testata solo per Xcode 10 e iOS 12). Aggiungi un'estensione per accedere al campo di testo della barra di ricerca:

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

Quindi utilizza quella proprietà per impostare il colore del testo del campo di testo nella barra di ricerca:

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

// MODIFICARE

Il codice sopra non funziona per iOS 13. Un modo migliore per gestirlo è usare:

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

per iOS 13 return subviews.first? .subviews.last? .subviews.compactMap {$ 0 as? UITextField} .last
— Taras

2

// Prova questo ragazzo

yourSearchbar.searchTextField.textColor = .white

2

Swift 5.2 e iOS 13.3.1: -

Funziona bene.

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


1

Ecco una versione Xamarin.iOS C # dell'approccio "trova UITextField". Non si arresta in modo anomalo se UITextField scompare nella futura gerarchia della vista 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;
        }
    }
}

0

Nella mia situazione la soluzione è

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

0

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

0

Swift 5:

searchBar[keyPath: \.searchTextField].textColor = UIColor(...)


0

In Swift 5 puoi fare qualcosa come di seguito:

yourSearchBar.searchTextField.textColor = .yourColor

0

Questo ha funzionato per me.

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

-1

Swift 5 Xcode 11.4 iOS 13.4

    UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).textColor = .white
    UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).font = .systemFont(ofSize: 13)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.