iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 20
0
Software Development

無中生有-從SWIFT語法學習到iOS APP的開發系列 第 20

Day20 - 儲存訂單 (segue傳值)

前言

昨天介紹了 protocol 傳值得方法,今天利用一個 save 的 button 可以整理訂單的陣列,順便藉由 segue 將頁面轉移到購物車頁面,除了轉移頁面外,還可以順便把訂單的陣列資料傳過去。

1. 設定購物車的 Table View 設定

table view怎麼設定就不再講了...一個 table view cell 裡面放兩個 Label 元件

新增檔案繼承 UIViewController
命名為 ShoppingCartViewController.swift

import UIKit

class ShoppingCartViewController: UIViewController, UITableViewDelegate, UITableViewDataSource

{
    
    var shoppingCartName: [String] = []
    var shoppingCartCount: [Int] = []
    
    @IBOutlet weak var shoppingTableView: UITableView!


    func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return shoppingCartName.count
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "shoppingCartCell", for: indexPath) as! ShoppingCartTableViewCell
        cell.shoppingNameLabel.text = shoppingCartName[indexPath.row]
        cell.shoppingCountLabel.text = "\(shoppingCartCount[indexPath.row])"

        return cell
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
    
}

新增檔案繼承 UITableViewCell
命名為 ShoppingCartTableViewCell.swift

import UIKit

class ShoppingCartTableViewCell: UITableViewCell {

    @IBOutlet weak var shoppingNameLabel: UILabel!
    @IBOutlet weak var shoppingCountLabel: UILabel!
    
    
    override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code
    }

    override func setSelected(_ selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)

        // Configure the view for the selected state
    }

}

2. 將 save button 連結到 ShoppingCartViewController

如下圖所示,直接從 save button 右鍵拖曳藍線拉到 ShoppingCartViewController,就會出現 segue 箭頭,點選箭頭在右側 Attributes 頁面中設定 segue identifier 為 segue

3. 回到 drinkViewController.swift 覆寫 prepare(for segue: UIStoryboardSegue sender: Any?) 方法

這邊值得一提的是,為了讓資料更好分辨,我將一開始的儲存資料型態由陣列改為字典 ["key": value] = ["飲料名稱": 訂購數]

var teaList = ["茉莉綠茶": 0, "阿薩姆紅茶": 0, "四季春茶": 0, "黃金烏龍": 0, "微檸檬 紅/青": 0, "檸檬 綠/青": 0, "梅果綠": 0, "8冰綠": 0, "養樂多綠": 0, "蜂蜜綠": 0, "芒果青": 0, "冰淇淋紅茶": 0, "鮮柚綠": 0, "波霸 紅/綠/青/烏": 0, "波霸奶茶(大顆)": 0, "波霸奶綠(大顆)": 0, "珍珠 紅/綠/青/烏": 0, "珍珠奶茶(小顆)": 0, "珍珠奶綠(小顆)": 0, "椰果奶茶": 0, "仙草奶凍": 0, "鮮柚汁(季節限定)": 0]

也因此可以利用訂購數量是否大於0來判別哪些飲料被訂購了

teaList.forEach { teaList in
                if teaList.value > 0 {
                    selecTeaName.append(teaList.key)
                    selecTeaCount.append(teaList.value)
                }

一開始以為這樣就完成了,結果自己測試的時候發現,每次按 save button ,selecTeaName 和 selecTeaCount 陣列內容就一直增加,所以只好多加一個判斷 selecTeaName是否存在

teaList.forEach { teaList in
                if teaList.value > 0 {
                    if selecTeaName.index(of: teaList.key) = nil {
                        selecTeaName.append(teaList.key)
                        selecTeaCount.append(teaList.value)
                    } else {
                        selecTeaCount[selecTeaName.index(of: teaList.key)] = teaList.count
                    }
        

最後測試的時候,又發現如果使用者 save 過一次,接著右將訂購數歸0再次按下 save,訂購飲料不會刪除

只好再加入一個判斷來刪除數字歸0的飲料,而上面所講的判斷式也用 if let 的方法來判斷是否 nil,來簡化程式碼

teaList.forEach { teaList in
                if teaList.value > 0 {
                    if let i = selecTeaName.index(of: teaList.key) {
                        selecTeaCount[i] = teaList.value
                    } else {
                        selecTeaName.append(teaList.key)
                        selecTeaCount.append(teaList.value)
                    }
                } else {
                    if let i = selecTeaName.index(of: teaList.key) {
                        selecTeaName.remove(at: i)
                        selecTeaCount.remove(at: i)
                    }
                }
            }

以上就是將訂單儲存下來的判斷式,接著要把資料傳給購物車頁面

if segue.identifier == "segue" {
    let VC = segue.destination as! ShoppingCartViewController
    
    // 判斷式... 略
    
    VC.shoppingCartName = selecTeaName
    VC.shoppingCartCount = selecTeaCount
}

4. 完成,效果如下

後記

耶!!訂購單顯示了,但是我的 tab bar也不見了...
看來我又有新的問題要解了...哭!


上一篇
Day19 - bug解除 (自定義 delegate 傳值:protocol應用)
下一篇
Day21 - 消失的 Tab Bar
系列文
無中生有-從SWIFT語法學習到iOS APP的開發30

尚未有邦友留言

立即登入留言