2016-04-20 27 views
0

相同視圖控制器我在故事板上有一個UIViewController一個名爲「MyViewController」(嵌入UINavigationController爲切入點)故事板ID, 和我試圖使用instantiateViewControllerWithIdentifier像其它類訪問:訪問使用instantiateViewControllerWithIdentifier

MyAccessor.swift

func accessMyViewController(){ 
    let storyboard = UIStoryboard(name: "Main", bundle: NSBundle.mainBundle()) 
    let vc = storyboard.instantiateViewControllerWithIdentifier("MyViewController") 
    print(vc.description) 
} 

MyViewController.swift

override func viewDidLoad() { 
    print(self.description) 
} 

控制檯

<MyViewController: 0x7ff6ab76f9c0> 
<MyViewController: 0x7ff6ab557410> 

我打印出不同的內存地址,

沒有他們應該是一樣的嗎?

+0

你只是實例化vc,而不是顯示它 –

+0

@MidhunMP它被顯示,因爲它被嵌入到被設置爲初始視圖控制器的導航控制器中。 – bluenowhere

+1

當你使用instantiateViewControllerWithIdentifier時,它分配新的實例。因此,在這種情況下有兩個實例,一個顯示(初始視圖控制器),第二個您使用代碼 –

回答

1

在本方法的documentation說,它總是會創建一個新的實例:

此方法創建指定的視圖控制器的每個調用它一個新的實例。

如果您需要視圖控制器的相同實例,則需要將引用存儲在其他位置(例如,創建第一個實例的視圖控制器)。

第一個實例MyViewController可能由故事板本身創建,因爲它是初始視圖控制器。

更新:

在代碼和問題又來尋找後,我現在才知道到底發生了什麼。如上所述,導航控制器是故事板的入口點。這意味着MyViewController的第一個實例是由故事板創建的,導致viewDidLoad方法中的第一個打印。 第二個實例由MyAccessor.swift中的代碼創建。同一文件內的打印輸出到第二個輸出行。但是,第二個實例的視圖永遠不會加載,這將導致永遠不會調用viewDidLoad。如果您打電話loadViewIfNeededvc它會導致第三個輸出行,它將打印與print相同的內存地址在MyAccessor.swift內。

+0

分配。就我所能理解的問題而言,作者實例化*一個*視圖控制器。 –

+0

原始問題中的控制檯部分列出MyViewController的兩個實例。但是'print'語句實際上會打印navigationController(從MyAccessor.swift中)和視圖控制器(從MyViewController.swift中)。 –

+0

是的,這就是問題的原因:他實例化了1個VC,但它打印了不同的地址。 –

2

可能您的navigationController是故事板入口點

所以,如果它是真的,有兩個實例..一個是在你的應用程序啓動時創建的,另一個是以編程方式從你的代碼中調用的。

P.S:viewDidLoad中將不只是通過實例化一個視圖控制器名稱,請參閱documentation的細節..,否則,你所看到的三版..

enter image description here

如果你想看到你立刻形勢嘗試修改您的打印線:

MyAccessor.swift

func accessMyViewController(){ 
    ... 
    print("∙ \(NSStringFromClass(self.dynamicType)) - vc details : \(vc.description) ") 
} 

MyViewController.swift

override func viewDidLoad() { 
    ... 
    print("∙ \(NSStringFromClass(self.dynamicType)) - self details : \(self.description) ") 
} 
+0

你的意思是初始視圖控制器在我能做任何事情之前自動啓動? – bluenowhere

+0

是的,我的意思是你的入口點.. –

相關問題