2011-10-21 48 views
6

背景:直到Xcode 4.2,使用任何模板創建的新項目都將包含MainWindow.xib,因此將傳遞nil作爲UIApplicationMain()的第四個參數。從Xcode 4.2開始,所有模板都通過傳遞類字符串作爲第四個參數來實例化應用程序委託,並且不要在xib中構建應用程序的窗口。Xcode 4.2模板更改 - UIApplication&MainWindow.xib

在4.2中完成這個設置很簡單,當然它的工作原理如下:創建xib設置UIApplication的文件所有者並連線代理,在Info.plist中指定它,在main()中爲nil第四個參數。

問題:爲什麼蘋果鼓勵實例化應用程序委託並在代碼中構建UIWindow而不是「舊方式?」有什麼好處?

注意事項:我希望這個新的模板的行爲,如果你選擇使用故事板的方式來管理用戶界面,但如果取消選中「使用故事板」我本來期望老通零和使用的-MainWindow.xib模板。

這個問題被問到迂迴的方式here,但答案有點討論。

+0

感謝您提供有關設置文件所有者和連線委託的提示;考慮到蘋果公司進行的快速工具更改,我無法遵循僅12個月的時間,但相當不合時宜的書籍。 – trojanfoe

回答

7

你在問蘋果爲什麼要做點什麼?除非蘋果已經明確地說出了他們還沒有做過的事情,否則就沒有明確的答案。

就我個人而言,我發現新方法相當優雅,透明和防彈。正如你所說的那樣,在舊方法中,主要的筆尖由運行時自動加載以響應Info.plist設置,而其他發生的事情都是通過筆尖完成的,特別是應用程序委託和窗口的實例化,以及相關的接線(應用程序委託必須作爲應用程序委託,窗口必須作爲應用程序委託的窗口),除非接下來我們回到應用程序委託中的代碼,以便最終呈現接口。

這很難理解;我在書中描述它時花了很大的篇幅。這也很容易打破。筆尖必須知道應用程序委託類的名稱,因此如果您不喜歡那些默認創建的有趣長名稱,那麼在更改它們時可以輕鬆地將所有內容都弄亂。

但是,現在,應用程序委託只是簡單地命名爲App Delegate,並在代碼中由UIApplicationMain()實例化,正如您所說的那樣;和其他所有的也是在代碼中作爲一個直接的後續工作:應用程序委託被實例化並調用didFinishLaunching,因此我們在代碼中創建窗口,將其分配給我們的代碼中的屬性,如果有是代碼中的一個,將窗口的rootViewController設置爲代碼,並像以前一樣顯示代碼中的接口。

因此,引導直接暴露在視圖中,因爲它是全部代碼。這使得它更容易理解和修改而不會破壞任何東西。就好像之前的模板設計師只是炫耀可以在幕後自發和自動發生的事情有多少;現在所有事情都明確公開。

+0

可以說模板文件是「好的」或「壞的」,但是一般來說,Apple沒有在沒有仔細考慮的情況下將某些東西放入模板中。他們非常清楚這些模板爲社區樹立了榜樣,在這種特殊情況下,這是一個相當大的變化。雖然您似乎對代碼和IB有個人關係,但我不確定是否完全解釋了更改模板的決定(當然,它可能 - 您觸及一個有趣的問題,即必須從代碼調用keyAndMakeVisible)。 – edelaney05

+1

我完全不同意。模板的思考非常糟糕,特別是考慮到它們的重要性。 Xcode 4中的拆分視圖模板包含一個巨大的缺陷,如果在縱向定位時存在低內存條件,則該缺陷將被暴露。 Xcode 4.2中的實用程序應用程序模板無緣無故地將FlipsideViewController的委託屬性聲明爲IBOutlet。 Xcode 4.2中的空應用程序模板(如果按原樣使用)將導致運行時警告!我可以繼續下去。這些模板無論如何都不是福音;他們更像是「提供建議」。 – matt

+0

你有很多有效的觀點,我沒有考慮過其他模板文件。我(天真地)推測,與以前版本的模板相比,這種重大變化必須是由於合理的推理而不是粗心。我認爲最可能的原因是IB(新)使用弱點的默認行爲的變化。 – edelaney05