質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

YouTube API

YouTube APIはYouTubeのビデオコンテンツと機能性をウェブサイト、アプリケーション、デバイスに統合することを可能にします。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

2022閲覧

他Viewから(YTPlayer)の取得したい。

beginer_dev

総合スコア16

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

YouTube API

YouTube APIはYouTubeのビデオコンテンツと機能性をウェブサイト、アプリケーション、デバイスに統合することを可能にします。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2016/09/24 01:46

編集2016/09/28 02:46

container view を使って上を動画ビュー。
下を動画を選択するnavigationを用いたtableviewで実装しています。

SongVCTで動画選択画面

SongTVC(下のtableviewcon)からVideoviewCon(上のviewcon)を制御するために

SongVCTで

// Cell が選択された場合 override func tableView(_ table: UITableView,didSelectRowAt indexPath: IndexPath) { self.appDelegate.selectMV = self.appDelegate.videoIDAR[indexPath.row] let video = ViewController() let vars = ["playsinline": 1, "controls": 2, "showinfo": 0, "origin":"https://www.google.com"] as [String : Any] video.playerView!.load(withVideoId: self.appDelegate.selectMV, playerVars: vars) video.playerView!.playVideo() }

と実装したのですが

Error

となり、playerView(YTPlayerView!)がnilでfatal error: unexpectedly found nil while unwrapping an Optional value
(lldb) となっていました。

どうすれば正しく取得できるのでしょうか?

追記
動画viewコード

import UIKit import youtube_ios_player_helper import AVFoundation class ViewController: UIViewController, YTPlayerViewDelegate{ @IBOutlet var playerView: YTPlayerView! var appDelegate:AppDelegate = UIApplication.shared.delegate as! AppDelegate override func viewDidLoad() { super.viewDidLoad() ///self.playerView?.delegate = self self.playerView.delegate = self //self.playerView?.sizeToFit() self.playerView.sizeToFit() player() let audioSession = AVAudioSession.sharedInstance() do { try audioSession.setCategory(AVAudioSessionCategoryPlayback) } catch { print("") } } func playerViewDidBecomeReady(_ playerView: YTPlayerView) { playerView.playVideo() } func play() { print("Push! play") //playerView.stopVideo() //playerView.delegate = self //self.playerView = YTPlayerView() playerView.load(withVideoId: self.appDelegate.selectMV) playerView.playVideo() } func player(){ let vars = ["playsinline": 1, "controls": 2, "showinfo": 0, "origin":"https://www.google.com"] as [String : Any] if self.appDelegate.selectMV == "" { print("Not load",self.appDelegate.selectMV) } else { print("Loaded",self.appDelegate.selectMV) playerView.load(withVideoId: self.appDelegate.selectMV, playerVars: vars) print("Check this",playerView) } } }

playerview

iboutlet

IBOutletで宣言したものを画像のように紐付けています

fatal error

Project image

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

#1 とりあえず

ViewControllerの初期化時にplayerViewのインスタンスが生成されていないのではないでしょうか?

#2 ViewControllerのviewを強制ロード

swift

1let sb = UIStoryboard(name: "Main", bundle: nil) //Storyboard: nameはStoryboardのファイル名 2let video = sb.instantiateViewControllerWithIdentifier("player") as! ViewController //IdentifierはViewControllerのStoryboard ID 3_ = video.view //viewにアクセスしてviewを強制ロードする 4print(video.playerView)

#3 無理矢理アクセスしてみる

1. Embed segueにidを付ける

ContainerViewとViewControllerを繋いでいるEmbed segueにidを付けます。今回はtopとしました。
embed segue identifier

2. ContainerViewを含むUIViewControllerのカスタムクラスを作る

ContainerViewController

swift

1class ContainerViewController: UIViewController { 2 3 //ViewControllerのインスタンス保存用 4 var viewController: ViewController? 5 6 override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 7 if segue.identifier == "top" { 8 viewController = segue.destinationViewController as? ViewController 9 NSLog("ViewController=%@", viewController!) 10 //=> ViewController=<project.ViewController: 0x14d64980> 11 } 12 } 13 /* その他は省略 */ 14}

viewの生成時にprepareForSegue()が呼ばれるようなので、さきほど付けたIdentifierで判別してインスタンスを保存しておきます。

3. ContainerViewControllerを介してplayerViewにアクセスします

下記のコードは下側のContainer(NavigationController使用)からのアクセス方法です。

swift

1if let 2 navi = self.navigationController, 3 container = navi.parentViewController, //これがContainerViewController 4 viewController = (container as! ContainerViewController).viewController 5{ 6 NSLog("playerView=%@", viewController.playerView) 7 //=> playerView=<UIView: 0x16534360; frame = (0 0; 0 0); layer = <CALayer: 0x165343f0>> 8 //(今回、playerViewはUIViewでテストしています) 9}

なお、NavigationControllerを使っていないContainerからContainerViewControllerに辿り着く方法を見つけられませんでした。あまり使い勝手がよろしくないかも? > ContainerView

投稿2016/09/26 07:03

編集2016/09/28 05:54
fuzzball

総合スコア16731

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

beginer_dev

2016/09/28 00:44

回答ありがとうございます。インスタンスについて調べたのですがそれをYTPlayerでviewdidloadでどう記載すればよいかわかりませんでした。コードをどう修正すればよいのでしょうか?
fuzzball

2016/09/28 00:52

ViewControllerでYTPlayerViewはどのように定義しているのでしょうか?Storyboardは使ってますか?
beginer_dev

2016/09/28 00:57

早急な返答ありがとうございます。storyboardを用いて追加した画像のように定義しています。
fuzzball

2016/09/28 01:08

ちゃんと紐付いてますね‥。今、追記したコードでも同じように落ちるのでしょうか? let video = ViewController() の直下に print(video.playerView) を追加して、出力結果を教えて下さい。
beginer_dev

2016/09/28 01:18

同じくfatal errorでplayerView nilとなりました。 画像追加します。
fuzzball

2016/09/28 02:02

あー、すみません。ViewController()じゃダメですね。コメントアウトしているコードのようにsb.instantiateViewControllerWithIdentifierで生成しないといけません。さらに、viewDidLoadまで実行させるためにviewを無理矢理ロードしないといけません。 一応、回答に追記しておきますが、このViewController()をどうするつもりなのでしょうか?コードの全体像が見えないので良く分かりませんが、このままではうまくいかないような気がします。
beginer_dev

2016/09/28 02:12

回答ありがとうございます。最終目標は読み込む動画をself.appdelegate.selectMVでcellタップ時に上書きしてるのでそれをタップ時にその動画を再生をしたいです。でそれまでに行き詰まってSwift3のNotificationCenterでやってみたり自分で考えられる方法を試してみてました。最終目標を達成するためにはどう書くことが理想的なのでしょうか?
fuzzball

2016/09/28 02:33

うまくいかないような気がするのは、このタイミングでViewController()を生成することの意味が分からないからです。(ましてやviewの強制ロードなんてことは普通しません)遷移するのであれば、Manual Segueで繋いで遷移させます。
beginer_dev

2016/09/28 02:41

回答ありがとうございます。私の考えがviewcontorollerで宣言してるplayerViewをとるにはと色々調べて中途半端な考えてこんなコードになっていましました。遷移に関してはcellをタップするこの部分で行うつもりはありません。プロジェクトのmainstoryboardの画像を追加して私のやりたいこととコードの矛盾をご指摘お願いいただけますでしょうか?
fuzzball

2016/09/28 03:04

ContainerViewを使っているというのは見落としていました。使ったことがないのでちょっと勉強してから回答しようと思いますが、ひとまず色々書いておくと、 起動時にプレイヤが表示されているならViewController()は生成されているということなので、タップ時に生成してはいけません。(生成したとしても、それは表示されているものとは別物です) で、ViewController()へのアクセスですが、単純にContainerView経由で出来ないのかなぁと思ったりしますので、その辺を調べてみます。 とりあえずということなら、appDelegateにViewCOntroller()のインスタンスを保存しておくという手もありますが。(appDelegateを経由して、「曲情報を渡す」のではなく、「ViewController()に曲情報を渡して再生」するということです)
beginer_dev

2016/09/28 03:36

丁寧親切な回答ありがとうございました。fuzzballさんのとりあえずに書かれたことを実践したら無事に再生されました。また何であのコードではだめだったのかも解説していただけたので理解出来ました。本当にありがとうございました。
fuzzball

2016/09/28 05:51

勉強してきました。 シンプルにアクセスする方法が無いようなので、意地になって無理矢理アクセスしてみました。裏技的であまり良い方法とは言えませんので参考程度に。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問