回答編集履歴

3

削除した古い回答を復活。

2016/09/28 05:54

投稿

fuzzball
fuzzball

スコア16731

test CHANGED
@@ -1,3 +1,31 @@
1
+ # #1 とりあえず
2
+
3
+ ViewControllerの初期化時にplayerViewのインスタンスが生成されていないのではないでしょうか?
4
+
5
+
6
+
7
+ # #2 ViewControllerのviewを強制ロード
8
+
9
+
10
+
11
+ ```swift
12
+
13
+ let sb = UIStoryboard(name: "Main", bundle: nil) //Storyboard: nameはStoryboardのファイル名
14
+
15
+ let video = sb.instantiateViewControllerWithIdentifier("player") as! ViewController //IdentifierはViewControllerのStoryboard ID
16
+
17
+ _ = video.view //viewにアクセスしてviewを強制ロードする
18
+
19
+ print(video.playerView)
20
+
21
+ ```
22
+
23
+
24
+
25
+ # #3 無理矢理アクセスしてみる
26
+
27
+
28
+
1
29
  ## 1. Embed segueにidを付ける
2
30
 
3
31
 

2

大改装。

2016/09/28 05:54

投稿

fuzzball
fuzzball

スコア16731

test CHANGED
@@ -1,21 +1,89 @@
1
- ViewControllerの初期化時playerViewのインスタンスが生成されていないのではないでしょうか?
1
+ ## 1. Embed segueにidを付ける
2
2
 
3
3
 
4
4
 
5
+ ContainerViewとViewControllerを繋いでいるEmbed segueにidを付けます。今回は`top`としました。
6
+
7
+ ![embed segue identifier](ce935b1024c42a14af08e9a04a49a784.png)
8
+
9
+
10
+
5
- # ViewControllerのview強制ロード
11
+ ## 2. ContainerViewを含むUIViewControllerのカスタムクラス作る
12
+
13
+
14
+
15
+ ![ContainerViewController](a84d71644fe9842689e1d9128ba3360a.png)
6
16
 
7
17
 
8
18
 
9
19
  ```swift
10
20
 
11
- let sb = UIStoryboard(name: "Main", bundle: nil) //Storyboard: nameはStoryboardのファイル名
21
+ class ContainerViewController: UIViewController {
12
22
 
13
- let video = sb.instantiateViewControllerWithIdentifier("player") as! ViewController //IdentifierはViewControllerのStoryboard ID
23
+
14
24
 
15
- _ = video.view //viewにアクセしてviewを強制ロードする
25
+ //ViewControllerのインタンス保存用
16
26
 
17
- print(video.playerView)
27
+ var viewController: ViewController?
28
+
29
+
30
+
31
+ override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
32
+
33
+ if segue.identifier == "top" {
34
+
35
+ viewController = segue.destinationViewController as? ViewController
36
+
37
+ NSLog("ViewController=%@", viewController!)
38
+
39
+ //=> ViewController=<project.ViewController: 0x14d64980>
40
+
41
+ }
42
+
43
+ }
44
+
45
+ /* その他は省略 */
46
+
47
+ }
18
48
 
19
49
  ```
20
50
 
21
51
 
52
+
53
+ viewの生成時にprepareForSegue()が呼ばれるようなので、さきほど付けたIdentifierで判別してインスタンスを保存しておきます。
54
+
55
+
56
+
57
+ ## 3. ContainerViewControllerを介してplayerViewにアクセスします
58
+
59
+
60
+
61
+ 下記のコードは下側のContainer(NavigationController使用)からのアクセス方法です。
62
+
63
+
64
+
65
+ ```swift
66
+
67
+ if let
68
+
69
+ navi = self.navigationController,
70
+
71
+ container = navi.parentViewController, //これがContainerViewController
72
+
73
+ viewController = (container as! ContainerViewController).viewController
74
+
75
+ {
76
+
77
+ NSLog("playerView=%@", viewController.playerView)
78
+
79
+ //=> playerView=<UIView: 0x16534360; frame = (0 0; 0 0); layer = <CALayer: 0x165343f0>>
80
+
81
+ //(今回、playerViewはUIViewでテストしています)
82
+
83
+ }
84
+
85
+ ```
86
+
87
+
88
+
89
+ なお、NavigationControllerを使っていないContainerからContainerViewControllerに辿り着く方法を見つけられませんでした。あまり使い勝手がよろしくないかも? > ContainerView

1

むりくり。

2016/09/28 05:49

投稿

fuzzball
fuzzball

スコア16731

test CHANGED
@@ -1 +1,21 @@
1
1
  ViewControllerの初期化時にplayerViewのインスタンスが生成されていないのではないでしょうか?
2
+
3
+
4
+
5
+ # ViewControllerのviewを強制ロード
6
+
7
+
8
+
9
+ ```swift
10
+
11
+ let sb = UIStoryboard(name: "Main", bundle: nil) //Storyboard: nameはStoryboardのファイル名
12
+
13
+ let video = sb.instantiateViewControllerWithIdentifier("player") as! ViewController //IdentifierはViewControllerのStoryboard ID
14
+
15
+ _ = video.view //viewにアクセスしてviewを強制ロードする
16
+
17
+ print(video.playerView)
18
+
19
+ ```
20
+
21
+