iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 10
0

我自己偷偷把快速記帳介面剩下的元件完成了,接下來我們就可以準備建立 Entity,然後把快速記帳的資料顯示於首頁。

什麼是 Entity?

Entity 用來表示我們專案內資料單位,比方說「快速記帳」是一個 Entity,而「收入」、「支出」、「標籤」等等都可以是 Entity。透過定義 Entity,我們可以很明確的定義出一個完整的資料單位,例如我們將每一個快速記帳的資料當作一個 Entity,此時,我們就可以將「金額」、「所有標籤」、「錄音檔」當作一個單位一起傳送;否則我們每次都將金額、標籤、錄音檔個別傳送的話,資料將會變得相當混亂,根本無法分辨哪個金額是對應哪個標籤。

每個專案都會有自己的 Entity,只要你覺得這些資料必須是在同一個單位裡,那他就可以是一個 Entity。當然 Entity 裡面也可以有其它 Entity,我們稱之為 Relations(關係)。

因此,我們可以在 Money Mom 裡面,將一個「快速記帳」定為一個 Entity,否則我們將無法分辯哪個金額對應哪個標籤和錄音檔。

建立 Entity 對應的物件

前面是理論,而實作上,我們會將 Entity 寫成一個「物件」,這樣就可以確保資料是一個整體的「單位」。

快速記帳 Entity 如下:

class QuickRecord {
    var amount: String?
    var tags: [String]?
    var audioRecording: String?

    init(amount: String, tags: [String], audioRecording: String) {
        self.amount = amount
        self.tags = tags
        self.audioRecording = audioRecording
    }
}

備註:金額用字串的原因,是因為考慮到之後會有小數點、大數運算,用字串來計算才不會失真。

建立 QuickRecordDelegate

我們可以建立一個 QuickRecordDelegate,讓任何可以處理快速記帳這個 Entity 的人,都可以透過實作這個 Delegate,來取得新增的資料。

protocol QuickRecordDelegate {
    func didAdd(quickRecord: QuickRecord)
}

然後我們可以在快速記帳介面右上角,擺上一個儲存的按鈕,使用者填寫完資料後,按下儲存,就會將 QuickRecord 傳給有實作 QuickRecordDelegate 的人,以便進一步處理資料。

navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .save, target: self, action: #selector(save))
@objc func save() {
    let quickRecord = QuickRecord(amount: amountTextField.text ?? "", tags: tags, audioRecording: "recording.m4a")

    delegate?.didAdd(quickRecord: quickRecord)

    navigationController?.popViewController(animated: true)
}

在首頁用 UITableView 顯示快速記帳內容

首先我們先放一個 UITableView:

let quickRecordTableView = UITableView()

override func viewDidLoad() {
    super.viewDidLoad()

    // ...略

    quickRecordTableView.dataSource = self
    quickRecordTableView.rowHeight = 50
    quickRecordTableView.separatorStyle = .none
    quickRecordTableView.register(QuickRecordTableViewCell.self, forCellReuseIdentifier: NSStringFromClass(QuickRecordTableViewCell.self))

    view.addSubview(quickRecordTableView)
    quickRecordTableView.translatesAutoresizingMaskIntoConstraints = false
    quickRecordTableView.leadingAnchor.constraint(equalTo: view.layoutMarginsGuide.leadingAnchor).isActive = true
    quickRecordTableView.trailingAnchor.constraint(equalTo: view.layoutMarginsGuide.trailingAnchor).isActive = true
    quickRecordTableView.topAnchor.constraint(equalTo: view.layoutMarginsGuide.topAnchor).isActive = true
    quickRecordTableView.bottomAnchor.constraint(equalTo: view.layoutMarginsGuide.bottomAnchor).isActive = true
}

並實作 QuickRecordDelegate,以便新增標籤完成時,將標籤內容加入 UITableView:

extension HomeViewController: QuickRecordDelegate {
    func didAdd(quickRecord: QuickRecord) {
        quickRecords.append(quickRecord)
        quickRecordTableView.reloadData()
    }
}

最後我們將 UITableView 的 DataSource 相關方法實作完成,便可以顯示快速記帳的資料了:

extension HomeViewController: UITableViewDataSource {
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return quickRecords.count
    }

    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.amountLabel.sizeToFit()

        cell.tagsLabel.text = quickRecords[indexPath.row].tags?.joined(separator: ", ")
        cell.tagsLabel.sizeToFit()

        return cell
    }
}

完成後,介面如下:

程式碼:GitHub

目前我們暫時把錄音檔忽略了,下一篇我們會專注在介面設計,然後再把錄音檔的功能補上。


上一篇
Money Mom - 快速記帳錄音功能
下一篇
Money Mom - 將快速記帳資料顯示於首頁 Part 2
系列文
iOS 三十天上架記帳 APP30

尚未有邦友留言

立即登入留言