Set UINavigationBar appearance whenContainedInInstancesOf to my viewcontroller not working
Asked Answered
B

4

7

I want to set white barTintColor in some viewcontroller I have set UINavigationBar.appearance().barTintColor for all default color but when I use appearance whenContainedInInstancesOf It's not change my viewcontroller

UINavigationBar.appearance(whenContainedInInstancesOf: [MyViewController.self]).barTintColor = .white

Any idea?. I tried this in my viewcontroller

self.navigationcontroller.navigationbar.barTintColor = .white

but I have to set color back to default when screen will disappear. I don't want to do like that. How can I do?

Burleson answered 22/2, 2017 at 20:48 Comment(4)
Possible duplicate of appearanceWhenContainedIn in SwiftBaez
@Baez I tried this UINavigationBar.appearance(whenContainedInInstancesOf: [MyViewController.self]).barTintColor = .white but it still not work!Burleson
But it says that it's only for iOS 10 so which version are you testing onBaez
@Baez my device is 10.1.1.Burleson
B
8

UINavigationBar is contained in a UINavigationController not UIViewController

with that said you need to create a custom UINavigationController

an empty class will do the job

class NavigationController: UINavigationController {}

then we can use it

UINavigationBar.appearance(whenContainedInInstancesOf: [NavigationController.self]).barTintColor = .white

Example can be found here

Baez answered 22/2, 2017 at 21:49 Comment(6)
I think this will change others screen too. which screens are next to first screen (screen that's need white navigationbar).Burleson
if you mean that this will change the color for UINavigationController too then no. it will take effect only for NavigationControllerBaez
@Burleson by the way did you think or try?Baez
Yeah, I tried. It's show as I think. It's change all screen that's in flow. Now I have to set it in each viewcontroller. I don't want to struck on it. Thanks for your solutions :)Burleson
@Burleson that's strange anyway I added an example to take a look at. Please let me know if you still have a problemBaez
This should be the correct answer, you saved my day. Thank you :)Adrien
B
7

@zombie has the correct answer. I just came across this issue a moment ago with UISearchBar. Here's the Swift 3 version of the answer. Using .red as the sample UIColor for this example.

 let textField = UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self])
 textField.tintColor = .red

 let searchBar = UIBarButtonItem.appearance(whenContainedInInstancesOf: [UISearchBar.self])
 searchBar.setTitleTextAttributes([NSForegroundColorAttributeName: .red], for: .normal)
 searchBar.setTitleTextAttributes([NSForegroundColorAttributeName: .red], for: .disabled)

Sample Image

Britnibrito answered 26/6, 2017 at 15:54 Comment(0)
B
3

Swift 4:

    // For the cursor color
    let textField = UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self])
    textField.tintColor = .lightBlue

    // For the cancel button on search bar
    UIBarButtonItem.appearance(whenContainedInInstancesOf: [UISearchBar.self]).setTitleTextAttributes([NSAttributedStringKey.foregroundColor: UIColor.white], for: .normal)
    UIBarButtonItem.appearance(whenContainedInInstancesOf: [UISearchBar.self]).setTitleTextAttributes([NSAttributedStringKey.foregroundColor: UIColor.lightText], for: .disabled)
Burrussburry answered 17/5, 2018 at 14:14 Comment(0)
B
0
UIBarButtonItem.appearance(whenContainedInInstancesOf: [UIImagePickerController.self]).setTitleTextAttributes([NSAttributedString.Key.foregroundColor: UIColor.black], for: .normal)

This worked for me!

Bonucci answered 27/8, 2019 at 10:36 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.