मैं UISearchBar खोज पाठ रंग कैसे बदल सकता हूं?


जवाबों:


108

आपको UITextFieldUISearchBar के अंदर पहुंचना होगा । आप का उपयोग करके कर सकते हैंvalueForKey("searchField")

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

textFieldInsideSearchBar?.textColor = yourcolor

स्विफ्ट 3 अपडेट

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

textFieldInsideSearchBar?.textColor = yourcolor

1
मैंने अपना उत्तर संपादित कर लिया है। आप valueforkey ("searchField") का उपयोग करके क्षेत्र तक पहुंच सकते हैं
ईसाई

7
यह निजी एपीआई नहीं है, लेकिन यह बहुत नाजुक है और किसी भी iOS अपडेट पर टूट सकता है। आपको कभी भी उत्पादन कोड में इन चीजों का उपयोग नहीं करना चाहिए
लोप

2
@ क्रिसियन - इससे कोई फर्क नहीं पड़ता कि मूल उत्तर कब पोस्ट किया गया था, यह अभी भी निजी एपीआई पर निर्भर करता है। यदि यह सार्वजनिक था, तो आपको searchFieldKVC के माध्यम से एक्सेस करने की आवश्यकता नहीं होगी ।
ग्रेग ब्राउन

1
Downvote। देखिये @ juanjo का जवाब और Apple द्वारा अनुमोदित अधिक मजबूत दृष्टिकोण के लिए मेरी टिप्पणी और जिसके टूटने की संभावना बहुत कम है।
रॉब

1
इस उत्तर का उपयोग न करें, आप निजी एपीआई तक पहुंच बना रहे हैं और यह आपके ऐप को अस्वीकार कर सकता है।
एरिकाक्स

63

यदि आप स्टोरीबोर्ड (कोड के बिना) में UISearchBar के लिए पाठ रंग सेट करना चाहते हैं, तो यह करना आसान है (पहचान निरीक्षक में)। यहां खोज बार के लिए एक लाल रंग का पाठ है।

यहाँ छवि विवरण दर्ज करें


2
तत्वों को देखने के लिए कम कोड होना बेहतर है। धन्यवाद।
एनआरआर

सही समाधान!
मोना

49

मेरे लिए स्विफ्ट 4 में काम करना:

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

स्विफ्ट 4.2, आईओएस 12:

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

मेरे लिए काम कर रहा है।
सुरजीत राजपूत

और यह मॉड्यूल में प्रत्येक खोज पट्टी के लिए रंग बदलता है?
ज़ापोरोज़ेन्को

48

यदि आपको केवल एक अंधेरे पृष्ठभूमि पर इसे पठनीय बनाने की आवश्यकता है, तो आप बारस्टाइल को बदल सकते हैं। निम्नलिखित खोज पट्टी में पाठ और बटन को सफेद बनाता है:

searchController.searchBar.barStyle = .black

@ बेकन, यह भी मदद की! धन्यवाद
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
    }
}

आप समाधान की तरह। धन्यवाद।
Bagusflyer

आप बार टिंट से अलग पाठ क्षेत्र की पृष्ठभूमि का रंग नियंत्रित करने के लिए "searchField.backgroundColor" भी जोड़ सकते हैं।
शेरविन जेडे

13

यह मेरे लिए iOS 11, Xcode 9 पर काम करता है:

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

मैं इसे लिखता हूं, AppDelegateलेकिन मुझे लगता है कि यह काम करता है यदि आप इसे कहीं और डालते हैं।


3
स्वीकार किए गए उत्तर और अन्य उत्तरों में कुंजी-मूल्य बकवास की तुलना में यह अधिक मजबूत दृष्टिकोण है। हालाँकि, Apple ने अपनी समझदारी से आपके द्वारा उपयोग किए गए API को हटा दिया है और iOS 9.0 और इसके बाद के संस्करण के लिए एक नया संस्करण प्रदान करता है, जैसे: [[UITextField appearanceWhenContainedInInstancesOfClasses:@[[UISearchBar class]]] setTextColor:[UIColor blueColor]];यह निश्चित रूप से Objective-C है, स्पष्ट अनुवाद के साथ Swift का उपयोग करते हुएappearance(whenContainedInInstancesOf:)
RobP

2
वास्तविक डिवाइस पर Xcode 10, iOS 12 में मेरे लिए काम नहीं करता है।
Oved

10

मुझे लगता है कि सबसे सुविधाजनक तरीका एक textColorसंपत्ति सेट करना है UISearchBar

स्विफ्ट 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
               }
           }
       }
   }

प्रयोग

searchBar.textColor = UIColor.blue // Your color

स्विफ्ट 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
         }
     }
 }
} 

आप इसका उपयोग इस प्रकार करेंगे:

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

मेरे लिए काम नहीं कर रहा। जब आप टेक्स्टकॉल संपत्ति सेट करते हैं?
किंगालियोन

1
@Kingalione आप इसे 'viewDidLoad ()' में सेट कर सकते हैं
Tal Zion

हाँ, मैं चाहता था कि टैक्चर्ड टेक्स्ट का रंग बदल जाए। अब मुझे उपाय मिल गए। वैसे भी धन्यवाद
Kingalione

10

Xcode 11 और iOS 13 के बाद से पाठ क्षेत्र को सीधे एक्सेस करना संभव हो गया है:

searchBar.searchTextField

आप हमेशा इसे इस तरह से सुलभ बनाने के लिए कुछ कोड लिख सकते हैं।

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

आप इसे घातक त्रुटियों के साथ वैकल्पिक नहीं बना सकते हैं, इस कोड का परीक्षण iOS 7 से iOS 13GM तक किया जाता है। लेकिन मैं सिर्फ वैकल्पिक संस्करण के लिए जाना होगा।

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

आखिरकार! हम सीधे टेक्स्ट फ़ील्ड तक पहुंच सकते हैं। धन्यवाद, सरीन।
मार्क मेयकेन्स

4

इसे इस्तेमाल करे,

searchBar.searchTextField.textColor = .white

मैं इसका उपयोग ऐप 11 लक्षित आईओएस के साथ कर रहा हूं।

[अपडेट] मैंने देखा, ऐप पुराने संस्करणों पर क्रैश हो गया (<iOS 13), लेकिन संकलक ने कभी भी संस्करण की जांच के बारे में शिकायत नहीं की, कोई कृपया बताएं कि यह क्यों हुआ।


3

आप इसे सर्चबियर के अंदर यूआईटेक्स्टफिल्ड पर पहुँच कर कर सकते हैं, फिर आप इसकी पृष्ठभूमि का रंग, टेक्स्ट का रंग और अन्य सभी यूआईटैक्सफ़िल्ड गुण बदल सकते हैं

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

मैंने ऊपर लिखे गए कुछ समाधानों की कोशिश की, लेकिन वे काम नहीं किए (अब, मुझे लगता है)।

अगर आप केवल iOS 13 को हैंडल करना चाहते हैं:

mySearchBar.searchTextField.textColor = .red

लेकिन अगर आप पुराने iOS को भी हैंडल करना चाहते हैं, तो यहां मैंने किया है:

एक कस्टम बनाने के लिए UISearchBarवर्ग कहा जाता है, SearchBar : UISearchBar, UISearchBarDelegate यह SearchBarहोगा UISearchBarDelegateतरीकों मैं संभाल करना चाहते हैं और इसकेdelegate सेट।

और मैं कक्षा में जोड़ता हूं:

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

संक्षिप्त विवरण:

अब iOS13 के साथ, आप UITextFieldधन्यवाद का उपयोग कर सकते हैं UISearchBar.searchTextField, जो कि प्रकार का है UISearchTextField, जो विरासत में मिला हैUITextField

जब से मैं अपने पदानुक्रम को जानता हूं, मुझे पता है कि मेरा textFieldनहीं होगाnill पुराने संस्करणों के लिए इसलिए दोनों ही मामलों में, मुझे एक टेक्स्टफ़ील्ड मिलता है जिसे मैं आसानी से कस्टमाइज़ कर सकता हूं, जो आज हर संस्करण पर काम कर रहा है, 9 से 13 तक।

यहाँ यह काम करने के लिए आवश्यक पूर्ण कोड है:


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

}

आप SearchBarइस पर जोड़कर कुछ अनुकूलन भी सेट कर सकते हैं :

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

फिर आप इसे एक्सआईबी / स्टोरीबोर्ड पर सेट करते हैं और आप इसे संभालते हैं जैसे कि यह एक साधारण था UISearchBar(यदि आप प्रतिनिधियों को नहीं भूले!)।


2

(यह समाधान केवल Xcode 10 और iOS 12 के लिए परीक्षण किया गया है) खोज बार के टेक्स्ट फ़ील्ड तक पहुंचने के लिए एक एक्सटेंशन जोड़ें:

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

फिर अपनी खोज पट्टी में टेक्स्ट फ़ील्ड का टेक्स्ट रंग सेट करने के लिए उस संपत्ति का उपयोग करें:

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

// EDIT

उपरोक्त कोड iOS 13. के लिए काम नहीं करता है। इसे इस्तेमाल करने का एक बेहतर तरीका है:

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

iOS 13 के लिए सब- इंटरव्यू। फ़र्स्ट .subviews.last? .subviews.compactMap {$ 0 के रूप में? UITextField} .last
टारस

2

// इस आदमी की कोशिश करो

yourSearchbar.searchTextField.textColor = .white

1

यहाँ "UITextField खोजें" दृष्टिकोण का Xamarin.iOS C # संस्करण है। भविष्य के iOS दृश्य पदानुक्रम में UITextField के गायब होने पर यह क्रैश नहीं होगा।

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

1

स्विफ्ट 5.2 और आईओएस 13.3.1: -

यह बढ़िया काम करता है।

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


0

मेरी स्थिति में समाधान है

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

0

Obj सी

UITextField *textField = [self.yourSearchbar valueForKey:@"_searchField"];
textField.textColor = [UIColor redColor];

स्विफ्ट 4.x

let textField = yourSearchbar.value(forKey: "searchField") as? UITextField
textField?.textColor = UIColor.red


0

स्विफ्ट 5 में आप नीचे कुछ ऐसा कर सकते हैं:

yourSearchBar.searchTextField.textColor = .yourColor

0

इसने मेरे लिए काम किया।

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

-1

स्विफ्ट 5 Xcode 11.4 iOS 13.4

    UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).textColor = .white
    UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).font = .systemFont(ofSize: 13)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.