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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

Q&A

1回答

1739閲覧

音楽プレイヤーのエラーについて

退会済みユーザー

退会済みユーザー

総合スコア0

Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

0グッド

0クリップ

投稿2016/02/01 09:16

音楽プレイヤーのエラーについて

以下のように、View Controller内に2つのプレイヤーを設置し、個別に再生、停止、ボリュームスライダーを設け、それぞれ別の音源を同時に鳴らすことができるようにしています。シミュレーター上でも実機でも、再生ボタンを押した後は安定して動作するのですが、再生ボタンを押さない状態で停止、またはスライダーにタッチすると、アプリが強制終了してしまいます。その際、停止ボタンにタッチしていれば停止ボタンに、スライダーならスライダーにthread1:EXC_BAD_ACCESS(code1,address=0×38)というエラーが出ます。再生ボタンを押してからならどのボタンもしっかり挙動するのに、再生のボタンを押さずに停止やスライダーをタッチした時だけ起こるのは何が原因なのでしょうか?初心者のため対策に難儀しております。ご教示いただけると幸いです。

import UIKit
import AVFoundation

class ViewController: UIViewController {

@IBAction func play(sender: AnyObject) {

let audioPath = NSBundle.mainBundle().pathForResource("sound", ofType: "wav")!

do {

try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
try AVAudioSession.sharedInstance().setActive(true)

try Player1 = AVAudioPlayer(contentsOfURL: NSURL(fileURLWithPath: audioPath))

Player1.play()

} catch {

}
}

@IBAction func play2(sender: AnyObject) {

let audioPath = NSBundle.mainBundle().pathForResource("music", ofType: "wav")!

do {

try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
try AVAudioSession.sharedInstance().setActive(true)

try Player2 = AVAudioPlayer(contentsOfURL: NSURL(fileURLWithPath: audioPath))

Player2.play()

} catch {
// Process error here
}
}

@IBAction func pause(sender: AnyObject) {

Player1.pause()

}

@IBAction func pause2(sender: AnyObject) {

Player2.pause()
}

@IBAction func adjustvolume1(sender: AnyObject) {

Player1.volume = volumeslider1.value
}

@IBAction func adjustvolume2(sender: AnyObject) {

Player2.volume = volumeslider2.value
}

@IBOutlet weak var volumeslider1: UISlider!

@IBOutlet weak var volumeslider2: UISlider!

var Player1: AVAudioPlayer = AVAudioPlayer()
var Player2: AVAudioPlayer = AVAudioPlayer()

override func viewDidLoad() {
super.viewDidLoad()

func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}

// MARK: Volume Changed

}

}

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

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

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

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

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

guest

回答1

0

再生するまで、Player1やPlayer2に不正なインスタンスが設定されています。
AVAudioPlayerクラスに引数なしのコンストラクタは定義されていません。
AVAudioPlayerをOptional型でラップするか、再生していない時は操作できないようにguardを書いてください。

投稿2016/02/01 10:08

Stripe

総合スコア2183

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

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

kohei421

2016/02/01 11:45

質問者本人です。 Stripeさま、迅速なご説明ありがとうございます。 Swift+iOSアプリ開発入門という本を参考に、AVAudioPlayerをOptional型でラップするか、再生していない時は操作できないようにguardを書くというのを試しているのですが、参考例がAVAudioPlayerではないため、まだまだ理解が及ばずエラーと格闘しております。 Optional型でラップする、あるいは再生時以外に停止やスライダーを操作してもguardで無効化しておくには、今回のような場合どのように記述すれば良いのでしょうか?
Stripe

2016/02/01 11:50

その参考書を読んで、どんなコードを書きましたか?
kohei421

2016/02/01 12:13

var Player1: AVAudioPlayer = AVAudioPlayer() の部分を var player1:AVAudioPlayer? の様に、型だけ指定するかたちにして、スライダーや停止ボタンの処理で、再生状態を変更使用とする前に「if let player = self.player1 { 変更処理 }」などとオプショナルバインディング(オプショナルも理解できていません)を行えば良いと解釈したので @IBAction func pause(sender: AnyObject) if let player = self.Player1 { Player1.pause() } というようなことをしてエラーを吐かれまくって焦っています。 まだ根本から勉強が足りないのは自覚しております。 これまでのコードはチュートリアルサイトや教本を参考に書いてうまくいっていたのですが、アプリのバックグラウンド再生や2つのプレイヤーを同時再生するようにしていくうちに、今回のエラーが起こるようになってしまいました。
Stripe

2016/02/01 12:21

var player1:AVAudioPlayer? = nil と定義して、 Player1?.pause() Player1?.volume = volumeslider1.value のように使用してください。
kohei421

2016/02/01 12:40

Stripeさま おかげさまで完璧に作動しました! これは前述の「AVAudioPlayerをOptional型でラップする」ということをしたという解釈で正しいのでしょうか?Player1やPlayer2にnilを代入し、各ボタンにも?を付けることで非再生時の挙動を制御できることになったということでしょうか? 勉強不足に関わらずお付き合いくださりありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問