在AppDelegate中定制UISearchBar&UINavigationBar的外观? 为什么要在课堂而不是实例级别自定义?

我正在学习这个教程 。 在它的AppDelegate中,它有一个customizeAppearance() ,其中UISearchBarUINavigationBar是types/类属性。 他们不应该是像窗口或当前viewController我们在? 我们如何才能发送一个类,然后让它改变我们的UI?

FWIW当我cmmd点击…显然它只是把它带到类的定义。

 import UIKit @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { var backgroundSessionCompletionHandler: (() -> Void)? var window: UIWindow? let tintColor = UIColor(red: 242/255, green: 71/255, blue: 63/255, alpha: 1) func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { // Override point for customization after application launch. customizeAppearance() return true } func application(application: UIApplication, handleEventsForBackgroundURLSession identifier: String, completionHandler: () -> Void) { backgroundSessionCompletionHandler = completionHandler } // MARK - App Theme Customization private func customizeAppearance() { window?.tintColor = tintColor UISearchBar.appearance().barTintColor = tintColor // shouldn't UISearchBar be a property of some other object? UINavigationBar.appearance().barTintColor = tintColor // shouldn't UINavigationBar be a property of some other object? UINavigationBar.appearance().tintColor = UIColor.whiteColor() UINavigationBar.appearance().titleTextAttributes = [NSForegroundColorAttributeName:UIColor.whiteColor()] } } 

(我将添加我的评论 – 回答OP关于课程级别定制的问题 – 作为回答,因为注释并不是持久的,可能OP本身可以在尝试查看注释中讨论的查询的基础上添加一个替代的彻底答案)


引用UISearchBar的语言参考 :

自定义外观

您可以一次自定义search栏的外观,也可以使用外观代理[UISearchBar appearance] )自定义应用程序中所有search栏的外观。

外观代理例如在UIKit用户界面目录中 – 关于视图 :

外观代理

您可以使用外观代理为应用程序中的视图的所有实例设置特定的外观属性 。 例如,如果您希望应用中的所有滑块具有特定的最小轨道色调颜色,则可以使用一条消息将其指定给滑块的外观代理。

有两种方法可以为对象自定义外观:对于容器类的实例中包含的所有实例和实例。

以及UIAppearance协议的语言参考

使用UIAppearance协议来获得一个类的外观代理。 您可以通过向该类的外观代理发送外观修改消息来自定义类的实例的外观。

  • 要自定义类的所有实例的appearance() ,请使用appearance()获取该类的外观代理

在你接下来的教程中,他们select使用外观代理方法,使用UIAppearance协议中的静态appearance()方法(例如UISearchBar遵循,通过UIViewinheritance)来获取和修改所有UISearchBar (和UINavigationBar )实例的外观代理,从类级别。


以下博客文章涵盖了外观代理的主题。 一个有启发性的阅读,尽pipe有点过时,使用Obj-C而不是Swift:

  • NSHipster – UIAppearance