iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 12
1

前言

上一篇我們完成了界面上的修改,這篇我們要專注在播放錄音檔的部分。

  • 亂數錄音檔名
  • 在 HomeViewController 界面上播放

亂數檔名

亂數的部分,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)
}

HomeViewController 加入播放錄音檔功能

首先我們要先在 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 的功能,讓資料能真正存在手機裏。


上一篇
Money Mom - 將快速記帳資料顯示於首頁 Part 2
下一篇
Money Mom - 回顧、整理、前瞻
系列文
iOS 三十天上架記帳 APP30

1 則留言

0
陳董 Don
iT邦新手 5 級 ‧ 2017-12-31 18:54:40

為什麼沒有主角的聲音,只有環境音 XD

/images/emoticon/emoticon15.gif

我怕我的聲音破壞了完美的工作室環境音XD

/images/emoticon/emoticon14.gif

我要留言

立即登入留言