2016-05-14 45 views

回答

1

定義 「作品」 時,它的工作原理。

是的,你可以實例化一個視圖控制器,而不必關心它是哪個子類的UIViewController。你從這個方法中得到的對象將是一個視圖控制器,因此可以對所有視圖控制器進行操作,這是很安全的:以模態方式呈現它,將其推送到導航控制器,將其添加到選項卡控制器,等

但是,如果你打算做一些與你的視圖控制器類特定的東西 - 就像SomethingViewController定義一個屬性,它允許你選擇它顯示的Something,並且你想要分配給該屬性 - 您需要做兩件事:

  1. 在運行時測試您從instantiateViewControllerWithIdentifier得到的對象是您期望它的類。 (因爲取決於你傳遞的標識符,它可能是其他類,或者如果該標識符不在故事板中,則根本沒有任何標識符。)
  2. 讓編譯器知道已將該對象分配給的變量是爲該類,以便編譯器將允許您訪問該類的屬性並調用該方法。

轉讓與as?as!演員一舉兩得。 (是否使用as?as!只是取決於你有多少信任你自己,以確保您的故事板標識符是什麼他們要求是,你希望如何處理這些假設的失敗。)


事實上,即使你不使用特定於該視圖控制器類的屬性或方法,as!強制轉換會添加一個運行時檢查,以確定視圖控制器類是您期望的。因此,當你演員出場時什麼都不會中斷,這不是一個表明演員是多餘的跡象 - 這是一個跡象表明,演員們正在檢查的任何破壞現在都沒有發生。

也就是說,如果有人更改了故事板以便標識符「something」位於SomethingElseViewController上,則引用的行將導致崩潰。如果你把它扔掉了,你就不會在那裏崩潰。 (你很可能就會遇到麻煩。)

但是,如果你真的想要做的是堅持你的故事板和程序的有效性,它可能會更好要清楚的是:

let someVC = self.storyboard!.instantiateViewControllerWithIdentifier("something") 
assert(someVC is SomethingViewController) 
// then do something non-SomethingViewController-specific with it 
+0

謝謝你的回答 –

相關問題