上一篇我們完成了界面上的修改,這篇我們要專注在播放錄音檔的部分。
亂數的部分,Swift 內建就有 UUID4 的實做,相當貼心啊!
簡單來說,我們只要用下列語法,就可以得到一串獨一無二(幾乎不可能重複)的字串了:
UUID().uuidString
因此,我們可以產生獨一無二的錄音檔名,如下:
lazy var audioFileName: String = {
return UUID().uuidString
}()
lazy var audioRecorder: AVAudioRecorder? = {
guard let documentDirectory = documentDirectory else {
return nil
}
var audioRecorder = try! AVAudioRecorder(url: documentDirectory.appendingPathComponent(audioFileName), settings: [
// ...略
])
audioRecorder.delegate = self
audioRecorder.prepareToRecord()
return audioRecorder
}()
錄音完成後,儲存時就可以將 UUID 存在 QuickRecord Entity 裡面,並傳回 HomeViewController 以便播放:
@objc func save() {
let quickRecord = QuickRecord(amount: amountTextField.text ?? "", tags: tags, audioRecording: audioFileName)
delegate?.didAdd(quickRecord: quickRecord)
navigationController?.popViewController(animated: true)
}
首先我們要先在 QuickRecordTableViewCell 裡面建立一個 AVAudioPlayer,以便播放錄音檔:
var player: AVAudioPlayer? {
didSet {
if player == nil {
playButton.setTitle("⤫", for: .normal)
playButton.isUserInteractionEnabled = false
} else {
playButton.setTitle("▶", for: .normal)
playButton.isUserInteractionEnabled = true
}
}
}
要注意的是,如果錄音檔可以正常播放,播放按鈕要顯示「▶」,反之則是「⤫」按鈕。
然後在 HomeViewController cellForRowAt 初始化 AVAudioPlayer:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: NSStringFromClass(QuickRecordTableViewCell.self), for: indexPath) as! QuickRecordTableViewCell
cell.amountLabel.text = "$" + (quickRecords[indexPath.row].amount ?? "")
cell.tags = quickRecords[indexPath.row].tags ?? []
if let documentDirectory = documentDirectory, let audioRecording = quickRecords[indexPath.row].audioRecording {
do {
cell.player = try AVAudioPlayer(contentsOf: documentDirectory.appendingPathComponent(audioRecording))
} catch {
cell.player = nil
}
}
return cell
}
因爲 GIF 沒聲音,沒辦法展示功能,想看的可以前往 YouTube 。
程式碼:GitHub
終於把主要功能告一段落,接下來要先回頭整理程式碼,然後再加入 Core Data 的功能,讓資料能真正存在手機裏。