2016-04-20 8 views
0

を使用して同じビューコントローラがIは、(エントリポイントとしてUINavigationControllerに埋め込まれた)「MyViewController」と呼ばれるストーリーボードのIDと、ストーリーボードにUIViewControllerを有し 及びIは次のよう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を使用すると、新しいインスタンスが割り当てられます。したがって、この場合は2つのインスタンスが表示されます(初期ビューコントローラ)。コードを使用して割り当てた2番目のインスタンス –

答えて

1

この方法のdocumentationで述べたように、それは常に新しいインスタンスを作成します。

このメソッドは、指定されたビューコントローラの新しいインスタンスにあなたがそれを呼び出すたびに作成されます。

ビューコントローラの同じインスタンスが必要な場合は、参照を別の場所に保存する必要があります(たとえば、最初のインスタンスを作成するビューコントローラ)。

最初のインスタンスMyViewControllerは、初期ビューコントローラであるためにストーリーボード自体によって作成される可能性があります。

更新:

再びコードと質問を見た後、私は今まさに何が起こるかを知っています。 説明したように、ナビゲーションコントローラはストーリーボードのエントリポイントです。これは、MyViewControllerの最初のインスタンスが、viewDidLoadメソッド内の最初の印刷につながるストーリーボードによって作成されることを意味します。 2番目のインスタンスは、コードによってMyAccessor.swiftに作成されます。同じファイル内の印刷が第2の出力行につながります。ただし、2番目のインスタンスのビューはロードされないため、viewDidLoadは呼び出されません。 loadViewIfNeededvcと呼ぶと、printと同じメモリアドレスをMyAccessor.swiftに出力する3番目の出力行が表示されます。

+0

質問から理解できる限り、作成者は* 1 *ビューコントローラをインスタンス化しました。 –

+0

元の質問のコンソール部分には、MyViewControllerの2つのインスタンスがリストされています。しかし、 'print'ステートメントは実際にはNavController(MyAccessor.swift内から)とView Controller(MyViewController.swift内から)を出力します。 –

+0

はい、その理由は質問されました。彼は1 VCをインスタンス化しましたが、別のアドレスを出力します。 –

2

あなたのnavigationControllerは、おそらくストーリーボードエントリポイントです。

trueの場合、2つのインスタンスがあります.1つはアプリケーションの起動時に作成され、もう1つはプログラムでコードから呼び出されます。

P.S:のviewDidLoadが..詳細についてはdocumentationを参照してください、ちょうどビューコントローラをインスタンス化することによって呼び出されることはありません、そうでなければ、3枚のプリントを見てきました。..

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

あなたが何かをすることができるようになる前に初期View Controllerが自動的に開始されることを意味しますか? – bluenowhere

+0

はいbluenowhere。私はあなたのエントリーポイントを意味します.. –