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

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

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

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

Swift

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

Q&A

解決済

2回答

2072閲覧

モーダル遷移後の画面から前の画面のオーディオを止めたい

退会済みユーザー

退会済みユーザー

総合スコア0

Xcode

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

Swift

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

0グッド

0クリップ

投稿2016/10/27 14:06

モーダル遷移前の画面で再生した音楽を遷移後のボタンで止める動作に関して質問です。今現在遷移前で次のコードを書いています。
試してみたこと
①オーディオ名がaudioPlayerGameなので、遷移前のビューコントローラ(QuizViewController)にaudioStopファンクションをつくり中にaudioPlayerGame?.stop()を書き、遷移先の画面でQuizViewController.audioStop()と記述した。

②コード下部にあるように、遷移先に値を受け渡すようにオーディオを受け渡そうとした。
しかしオーディオは関数の中で指定されており、prepare(for segue...の中で受け渡すことができなかった。さらに受け渡したところで、前画面の音楽を操作することにはつながらないのでは?という疑問もあります。

swift

1import UIKit 2import AVFoundation 3 4class QuizViewController: UIViewController { 5 var audioPlayerGame:AVAudioPlayer! 6 override func viewDidLoad() { 7 super.viewDidLoad() 8 self.qText.isEditable=false 9 if UserDefaults.standard.object(forKey:"count") != nil { 10 count=0 11 UserDefaults.standard.set(count,forKey:"count") 12 correct=0 13 UserDefaults.standard.set(correct,forKey:"correct") 14 15 if let url = Bundle.main.url(forResource: "game_maoudamashii_5_village02", withExtension: "mp3") { 16 do { 17 audioPlayerGame = try AVAudioPlayer(contentsOf: url) 18 audioPlayerGame?.play() 19 } catch { 20 // プレイヤー作成失敗 21 // その場合は、プレイヤーをnilとする audioPlayer = nil 22 } 23 } else { 24 // urlがnilなので再生できない fatalError("Url is nil.") 25 } 26 27 } 28 } 29override func didReceiveMemoryWarning() { 30 super.didReceiveMemoryWarning() 31 // Dispose of any resources that can be recreated. 32 } 33 34 35 36 37 @IBAction func returnTop(segue:UIStoryboardSegue){ 38 } 39//<試してみたこと②のときに書き加えた部分> 40 override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 41 if (segue.identifier == "next") { 42 let subVC: CommentaryViewController = segue.destination as! CommentaryViewController 43 CommentaryViewController.audioPlayerGame2 = audioPlayerGame 44 45 } } 46//<試してみたこと② ここまで> 47 48 func nextPage(){ 49 self.performSegue(withIdentifier: "next", sender: nil) 50 } 51 52 func audioStop(){ 53 audioPlayerGame?.stop() 54 } 55 56 } 57

できるだけ理解していただけるように書いたつもりですが、わかりにくい箇所等あれば、ご指摘いただければと思います。
どうかよろしくお願いします。

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

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

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

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

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

fuzzball

2016/10/27 23:56 編集

(deleted)
guest

回答2

0

モーダルの呼び出し元は`presentingViewController'で取れますので、

swift

1let vc = presentingViewController as! QuizViewController 2vc.audioStop()

これでaudioPlayerGameを渡す必要はないかと思います。

投稿2016/10/27 23:51

編集2016/10/28 00:24
fuzzball

総合スコア16731

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

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

fuzzball

2016/10/27 23:53

間違えていたので削除しました。
fuzzball

2016/10/28 00:24

やり直しました。
退会済みユーザー

退会済みユーザー

2016/10/28 06:58

ありがとうございます!どちらも参考になり大変勉強になりました。 どちらの方もベストアンサーにしたかったのですが、今回は回答を早くいただけたということでfromageblanc様にさせていただきました、すみません。 いつも素早く適切に対応して下さるfuzzball様に感謝しております。 またお尋ねする際にもどうぞ宜しくお願いします。
guest

0

ベストアンサー

一番手っ取り早いのはAVAudioPlayerのインスタンスをグローバルにしてしまう方法です。
classの外側で宣言するとグローバルになります。

QuizViewController.swift

swift

1var audioPlayerGame:AVAudioPlayer! // global 2 3class QuizViewController: UIViewController {

CommentaryViewController.swift

swift

1audioPlayerGame.stop()

投稿2016/10/27 17:10

fromageblanc

総合スコア2724

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

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

退会済みユーザー

退会済みユーザー

2016/10/28 06:53

ありがとうございます、解決しました。 またご丁寧に説明いただき、大変勉強になりました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問