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

Posted

技术标签:

【中文标题】自定义 TableViewController 声音在 Swift 3 中播放和崩溃【英文标题】:Custom TableViewController sounds play and crash in Swift 3 【发布时间】:2017-07-14 09:34:18 【问题描述】:

我正在使用 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.
     

【问题讨论】:

问题是players = [setupAudioPlayerWithFile(file: self.audioFileNames[indexPath.row]! as String, type: "mp3")!] 您不需要创建音频播放器数组,只使用一个音频播放器,只需单击 tableview 单元格即可停止和启动 【参考方案1】:

    你必须在viewDidLoad中初始化players

    players = Array(repeating: nil, count: audioFileNames.count)
    

    您必须在使用前检查播放器是否已启动

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

【讨论】:

【参考方案2】:

我已经尝试过了,但它不适用于一系列玩家。您需要一次播放一个。

【讨论】:

【参考方案3】:

很确定这是 swift 的某种错误行为 我发现如果你这样初始化:

var player: AVAudioPlayer? = nil

会更好;每次引用它时,添加一个“?”给它 例如:

player?.play()

当没有设置 URL 时它将停止崩溃。 在某些情况下,这确实是必要的,并且没有其他明显的替代方案。

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

【讨论】:

以上是关于自定义 TableViewController 声音在 Swift 3 中播放和崩溃的主要内容,如果未能解决你的问题,请参考以下文章

使自定义 UI 元素不在 TableViewController 中滚动

如何将自定义类分配给 TableViewController

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

无法使用 CFQuery TableViewController (Swift 2) 显示自定义单元格

如何为 tableViewController 中的自定义单元格按钮创建手势识别器,以便能够识别它所在的单元格?

自定义 TableView 函数没有被调用?