Làm cách nào để thay đổi màu văn bản tìm kiếm của UISearchBar?


Câu trả lời:


108

Bạn phải truy cập vào UITextFieldbên trong UISearchBar. Bạn có thể làm điều đó bằng cách sử dụngvalueForKey("searchField")

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

textFieldInsideSearchBar?.textColor = yourcolor

Bản cập nhật Swift 3

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

textFieldInsideSearchBar?.textColor = yourcolor

1
Tôi đã chỉnh sửa câu trả lời của mình. Bạn có thể truy cập trường bằng cách sử dụng valueforkey ("searchField")
Christian

7
Nó không phải là API riêng nhưng rất mỏng manh và có thể bị hỏng trên bất kỳ bản cập nhật iOS nào. Bạn không bao giờ nên sử dụng những thứ như thế này trong mã sản xuất
Lope

2
@Christian - không quan trọng khi câu trả lời ban đầu được đăng, nó vẫn dựa trên API riêng. Nếu nó là công khai, bạn không cần phải truy cập searchFieldqua KVC.
Greg Brown

1
Phản đối. Hãy xem câu trả lời của @ juanjo và nhận xét của tôi để biết một cách tiếp cận mạnh mẽ hơn được Apple chấp thuận và ít có khả năng bị phá vỡ hơn nhiều.
RobP

1
Không sử dụng câu trả lời này, bạn đang truy cập các API riêng tư và nó có thể khiến ứng dụng của bạn bị từ chối.
aryaxt

63

Nếu bạn muốn đặt màu văn bản cho UISearchBar trong bảng phân cảnh (không có mã), cũng dễ dàng thực hiện (trong trình kiểm tra danh tính). Đây là một văn bản màu đỏ cho thanh tìm kiếm.

nhập mô tả hình ảnh ở đây


2
Tốt hơn là có ít mã hơn cho các phần tử chế độ xem. Cảm ơn.
NRR

Giải pháp hoàn hảo!
Mona

49

Làm việc trong Swift 4 cho tôi:

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]

Làm việc cho tôi.
Surjeet Rajput

và nó thay đổi màu sắc cho mọi thanh tìm kiếm trong mô-đun?
Zaporozhchenko Oleksandr

48

Nếu bạn chỉ cần làm cho nó có thể đọc được trên nền tối, bạn có thể thay đổi barStyle. Điều sau đây làm cho văn bản và các nút trong thanh tìm kiếm có màu trắng:

searchController.searchBar.barStyle = .black

@Bacon, Nó cũng hữu ích! Cảm ơn
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
    }
}

Như bạn giải pháp. Cảm ơn.
Bagusflyer,

Bạn cũng có thể thêm "searchField.backgroundColor" để kiểm soát màu nền của trường văn bản tách biệt với màu thanh.
Sherwin Zadeh

13

Điều này phù hợp với tôi trên iOS 11, Xcode 9:

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

Tôi viết nó trong AppDelegatenhưng tôi đoán nó hoạt động nếu bạn đặt nó ở một nơi khác.


3
Đây là một cách tiếp cận mạnh mẽ hơn nhiều so với vô nghĩa giá trị khóa trong câu trả lời được chấp nhận và các câu trả lời khác. Tuy nhiên, Apple trong sự khôn ngoan của họ đã bị phản đối API bạn sử dụng ở đây và cung cấp một phiên bản mới dành cho iOS 9.0 trở lên, như vậy: [[UITextField appearanceWhenContainedInInstancesOfClasses:@[[UISearchBar class]]] setTextColor:[UIColor blueColor]];Đây là khóa học Objective-C, với dịch hiển nhiên đối với Swift sử dụngappearance(whenContainedInInstancesOf:)
RobP

2
Dường như không hoạt động với tôi trong Xcode 10, iOS 12, trên một thiết bị thực tế.
Oded

10

Cách thuận tiện nhất mà tôi nghĩ là đặt một textColortài sản vào 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
               }
           }
       }
   }

Sử dụng

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

Bạn sẽ sử dụng nó như:

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

không làm việc cho tôi. khi nào bạn đặt thuộc tính textcolor?
Kingalione

1
@Kingalione bạn có thể thiết lập này trong 'viewDidLoad ()'
Tal Zion

Vâng, tôi muốn thay đổi màu văn bản của dấu hiệu. Bây giờ tôi đã tìm thấy các giải pháp. Thanks anyway
Kingalione

10

Kể từ Xcode 11 và iOS 13, có thể truy cập trực tiếp vào trường văn bản:

searchBar.searchTextField

Bạn có thể viết một số mã để luôn làm cho nó có thể truy cập được như thế này.

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

Bạn cũng có thể làm cho nó không phải là tùy chọn với các lỗi nghiêm trọng, mã này được kiểm tra từ iOS 7 cho đến iOS 13GM. Nhưng tôi sẽ chỉ sử dụng phiên bản tùy chọn.

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

Cuối cùng! Chúng ta có thể truy cập trực tiếp vào trường văn bản. Cảm ơn, Saren.
Mark Moeykens

4

Thử đi,

searchBar.searchTextField.textColor = .white

Tôi đang sử dụng điều này với ứng dụng được nhắm mục tiêu từ iOS 11 trở đi.

[Cập nhật] Tôi đã quan sát thấy, ứng dụng bị treo trên các phiên bản cũ hơn (<iOS 13), nhưng trình biên dịch chưa bao giờ phàn nàn về việc kiểm tra phiên bản, ai đó vui lòng giải thích tại sao điều này xảy ra.


3

Bạn có thể làm điều này bằng cách truy cập UITextField bên trong SearchBar, sau đó bạn có thể thay đổi màu nền, màu văn bản và tất cả các thuộc tính khác của UITextField

thêm phần mở rộng sau để truy cập 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

Tôi đã thử một số giải pháp được viết ở trên nhưng chúng không hoạt động (tôi đoán vậy nữa).

Nếu bạn chỉ muốn xử lý iOS 13:

mySearchBar.searchTextField.textColor = .red

Nhưng nếu bạn cũng muốn xử lý iOS cũ hơn, đây là cách tôi đã làm:

Tạo một UISearchBarlớp tùy chỉnh , được gọi là SearchBar : UISearchBar, UISearchBarDelegate Lớp này SearchBarsẽ có các UISearchBarDelegatephương thức tôi muốn xử lý và delegatetập hợp của nó .

Và tôi thêm vào lớp:

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

Giải thích ngắn gọn:

Với iOS13 bây giờ, bạn có thể truy cập UITextFieldcảm ơn UISearchBar.searchTextField, thuộc loại UISearchTextFieldkế thừa từ UITextField.

Vì tôi biết hệ thống phân cấp của mình, tôi biết tôi textFieldsẽ không nilldành cho các phiên bản cũ hơn nên trong cả hai trường hợp, tôi nhận được một trường văn bản mà tôi có thể dễ dàng tùy chỉnh, làm việc trên mọi phiên bản, từ 9 đến 13 hiện nay.

Đây là mã đầy đủ cần thiết để làm cho nó hoạt động:


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

}

Bạn cũng có thể thiết lập một số tùy chỉnh SearchBarbằng cách thêm điều này vào:

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

Sau đó, bạn đặt nó thành XIB / Storyboard và bạn xử lý nó như thể nó đơn giản UISearchBar(nếu bạn không quên các đại diện!).


2

(Giải pháp này chỉ được thử nghiệm cho Xcode 10 và iOS 12.) Thêm một tiện ích mở rộng để truy cập vào trường văn bản của thanh tìm kiếm:

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

Sau đó, sử dụng thuộc tính đó để đặt màu văn bản của trường văn bản trong thanh tìm kiếm của bạn:

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

// BIÊN TẬP

Đoạn mã trên không hoạt động với iOS 13. Một cách tốt hơn để xử lý vấn đề này là sử dụng:

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

cho iOS 13 trả lại subviews.first? .subviews.last? .subviews.compactMap {$ 0 dưới dạng? UITextField} .last
Taras

2

// Hãy thử anh chàng này

yourSearchbar.searchTextField.textColor = .white

1

Đây là phiên bản Xamarin.iOS C # của phương pháp "tìm UITextField". Nó sẽ không bị lỗi nếu UITextField biến mất trong hệ thống phân cấp chế độ xem iOS trong tương lai.

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

Swift 5.2 & iOS 13.3.1: -

Nó hoạt động tốt.

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


0

Trong tình huống của tôi, giải pháp là

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

0

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

Trong Swift 5, bạn có thể làm như sau:

yourSearchBar.searchTextField.textColor = .yourColor

0

Điều này đã làm việc cho tôi.

    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)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.