🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Swift

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

Q&A

解決済

1回答

1415閲覧

Swiftで動画終了後の画面遷移について

takareinhard

総合スコア5

Swift

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

0グッド

0クリップ

投稿2019/09/16 03:56

編集2019/09/16 05:40

前提・実現したいこと

Swiftで動画が終了した際に今いるPlumeriaViewControllerから次のResultViewControllerへ画面が遷移するように実装しています。
しかし、エラーが発生しどうしても画面が遷移しません。

発生している問題・エラーメッセージ

whose view is not in the window hierarchy!

該当のソースコード

Swift

1 2import UIKit 3import AVKit 4 5class PlumeriaViewController: UIViewController { 6 7 var player: AVPlayer! 8 9 10 11 @IBAction func Plumeria4Result(_ sender: Any) { 12 13 if let path = Bundle.main.path(forResource: "Plumeria4" , ofType: "mp4") 14 { 15 let video = AVPlayer(url: URL(fileURLWithPath: path)) 16 let videoPlayer = AVPlayerViewController() 17 videoPlayer.player = video 18 19 present(videoPlayer, animated: true, completion: 20 { 21 video.play() 22 }) 23 } 24 25} 26 27 override func viewDidAppear(_ animated: Bool) { 28 super.viewDidAppear(animated) 29 NotificationCenter.default.addObserver(self, 30 selector: #selector(self.movieEnd), 31 name: NSNotification.Name.AVPlayerItemDidPlayToEndTime, 32 object: nil) 33} 34 35 @objc func movieEnd() { 36 let ResultViewController = self.storyboard?.instantiateViewController(withIdentifier: "last") as! ResultViewController 37 self.present(ResultViewController, animated: true, completion: nil) 38 } 39

試したこと

エラーに対しての対処法として書かれているのは

override func viewDidLoad() {
super.viewDidLoad()

ではなく、

override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated)

でやれば上手く行くと書かれていますが、その通りやっても上手く行きませんでした。というか

@objc func movieEnd() {

}

の部分にviewDidLoadを入れる感じだと思いますが、やり方が分からないので教えていただければと思います。

補足情報(FW/ツールのバージョンなど)

すいません。よろしくお願いします。

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

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

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

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

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

guest

回答1

0

自己解決

@objc func movieEnd() {

let ResultViewController = self.storyboard?.instantiateViewController(withIdentifier: "last") as! ResultViewController self.present(ResultViewController, animated: true, completion: nil)

の間に

self.dismiss(animated: true)

を入れたら画面遷移自体は出来ました。どうやらAVPlayerViewControllerから直接遷移しようとしたから遷移できない感じだったようです。

なので、まずはAVPlayerViewControllerを閉じるという事をやったところひとまずは上手く行きました。

ただ一旦PlumeriaViewControllerに戻るので、そのPlumeriaViewControllerがチラ見した後にResultViewControllerに遷移するのを改善したい感です。

追記

PlumeriaViewControllerとResultViewControllerの間にもう1つMovieViewControllerを挿れて、そこで動画を再生させるようにしました。そしてMovieViewControllerのUIはUI imageで真っ黒にすることにより、MovieViewControllerからResultViewControllerに以降する際、MovieViewControllerがチラ見しますが、真っ黒なのでPlumeriaViewControllerから遷移するよりは自然になりました。
しかし、黒が一瞬見えるのではなく、動画からそのままスムーズにResultViewControllerに遷移させたいのでその方法を教えていただければ嬉しいです。

投稿2019/09/16 16:16

編集2019/09/20 03:03
takareinhard

総合スコア5

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

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

takareinhard

2019/09/20 03:02

PlumeriaViewControllerとResultViewControllerの間にもう1つMovieViewControllerを挿れて、そこで動画を再生させるようにしました。そしてMovieViewControllerのUIはUI imageで真っ黒にすることにより、MovieViewControllerからResultViewControllerに以降する際、MovieViewControllerがチラ見しますが、真っ黒なのでPlumeriaViewControllerから遷移するよりは自然になりました。 しかし、黒が一瞬見えるのではなく、動画からそのままスムーズにResultViewControllerに遷移させたいのでその方法を教えていただければ嬉しいです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問