自定义TableViewController声音在Swift 3中播放和崩溃

时间:2017-07-14 09:34:18

标签: ios swift uitableview swift3 avplayer

我正在使用Swift 3中的音频数组。

import Foundation
import UIKit
import AVFoundation


class TableViewController: UITableViewController, AVAudioPlayerDelegate {

    var players: [AVAudioPlayer] = []
    var audioFileNames = [String?]()

    override func viewDidLoad() {        
        audioFileNames = [ "ɔɪ", "eə", "aʊ", "eɪ"]
    }

我将个别声音显示在自定义单元格中。如果我按下一个单元格就会播放声音但是当我按下另一个单元格时,该应用程序会冻结并崩溃。

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return self.audioFileNames.count
    }

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell:UITableViewCell = tableView.dequeueReusableCell(withIdentifier: "Cell")! as UITableViewCell
        cell.textLabel?.text = self.audioFileNames[indexPath.row]

        return cell
    }

这个代码在这个函数处打破了。

    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        players = [setupAudioPlayerWithFile(file: self.audioFileNames[indexPath.row]! as String,  type: "mp3")!]
        players[indexPath.row].play()
    }

    func setupAudioPlayerWithFile(file: String, type: String) -> AVAudioPlayer?  {
        let path = Bundle.main.path(forResource: file as String, ofType: type as String)
        let url = NSURL.fileURL(withPath: path!)

        var audioPlayer:AVAudioPlayer?

        do {
            try audioPlayer = AVAudioPlayer(contentsOf: url)
        } catch {
            print("Player not available")
        }

        return audioPlayer
    }

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

3 个答案:

答案 0 :(得分:0)

  1. 您必须在players

    中初始化viewDidLoad
    players = Array(repeating: nil, count: audioFileNames.count)
    
  2. 您必须在使用之前检查播放器

    if players[indexPath.row] == nil {
        players[indexPath.row] = setupAudioPlayerWithFile(file: self.audioFileNames[indexPath.row]! as String,  type: "mp3")    
    }
    

答案 1 :(得分:0)

我已经尝试了这个,它不适用于玩家阵列。你需要一次玩一个。

答案 2 :(得分:0)

非常确定它是swift的某种错误行为 我发现如果你这样做:

var player: AVAudioPlayer? = nil

会更好;每次你引用它时,添加一个" ?"它 例如:

player?.play()

当未设置URL时,它将停止崩溃。 有些情况下这是非常必要的,而且没有其他明显的选择。

如果有人找到更好的解决方案,请告诉我们!