2016-12-25 83 views
2

我正在關注this tutorial。在它的AppDelegate中它有一個customizeAppearance(),其中UISearchBar & UINavigationBar是類型/類屬性。它們不應該是窗口或我們所在的當前viewController之類的屬性嗎?!我們如何才能發佈一個類,然後讓它改變我們的UI?在AppDelegate中自定義UISearchBar&UINavigationBar的外觀?爲什麼要在課堂而不是實例級別自定義?

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()] 
    } 
} 
+2

引用[用於'UISearchBar'語言參考](https://developer.apple.com/reference/uikit/uisearchbar):_「您可以一次自定義搜索欄的外觀,或者您可以使用外觀代理('[UISearchBar appearance]')自定義應用程序中所有搜索欄的外觀。 「_。在你接下來的教程中,他們選擇了後者的代理方法,利用[UIAppearance'協議]中的藍圖的靜態'appearance()'方法(https://developer.apple.com/reference/ uikit/uiappearance)例如'UISearchBar'符合(通過'UIView'繼承)。 – dfri

+0

@dfri ohh。哇。這很方便。所以,如果我一次更換一個,並使用外觀進行自定義。代理方法將被覆蓋權利?也是這種*代理*機制在其他地方提供的可可觸摸或不是? – Honey

+1

我不能說沒有測試,但進一步引用語言參考。對於'UIAppearance':_「iOS在視圖進入窗口時應用外觀變化,它不會改變已經在窗口中的視圖的外觀......」_以及_「在任何給定的視圖層次結構中,最外層的外觀代理獲勝。「_。所以我相信取決於您選擇自定義外觀的位置(或深度),默認/自定義代理行爲(在視圖進入窗口時加載)或您的自定義實例集行爲將優先。看看參考文獻。 docs for'UIAppearance' for det.s. – dfri

回答

1

(我將添加我的意見,回答OP的關於一流水平的定製,作爲一個答案,因爲評論是不是永久性的。可能的OP他/她可以根據試圖添加備用徹底回答問題出在評論中討論的查詢)


報價the language reference for UISearchBar

丘斯托mizing外觀

您可以一次自定義搜索欄一個外觀,或者您 可以使用外觀代理[UISearchBar appearance])來定製 在應用程序的所有搜索欄的外觀。

外觀代理被覆蓋,例如,在UIKit User Interface Catalog - About Views

外觀代理

您可以使用外觀代理設置特定的外觀視圖的所有實例 特性在應用程序中。對於 示例,如果您希望應用中的所有滑塊具有特定的 最小軌道色調顏色,則可以通過一條消息 指定該滑塊的外觀代理。

有兩種方法可以自定義對象的外觀:對於所有 實例以及包含在容器類實例中的實例。

...

還有在爲UIAppearance protocol

使用UIAppearance協議,以獲得外觀代理的 類的語言參考。您可以通過 自定義類的實例的外觀,向該類的外觀 代理髮送外觀修改消息。

...

  • 要自定義一個類,使用appearance()的所有實例的外觀獲得外觀代理該類

在你按照教程,他們已經選擇使用外觀代理的辦法,利用靜態appearance()方法作爲UIAppearance協議blueprinted(到例如UISearchBar符合,通過UIView繼承)從類級別獲取並修改所有UISearchBar(和UINavigationBar)實例的外觀代理。


以下博客文章涵蓋了外觀代理的主題。一種有益的讀取,即使是稍微過時和使用的OBJ-C而不是夫特: