--

34 訂可不可飲料app-後篇

完成資料下載後,繼續完成資料上傳的部份。

操作畫面:

一、建立可以上傳的airtable。

取得API網址和token後,先來postman測試可否成功上傳資料。

看來有成功上傳~api網址和token沒有問題。

二、上傳資料的struct:我們用剛剛的json格式請chatgpt幫我們寫struct:

import Foundation

//上傳用
struct APIResponse: Codable {
var records: [Record]

struct Record: Codable {
var fields: Fields

struct Fields: Codable {
var orderName: String
var drinkName: String
var size: String
var temperature: String
var ice: String
var sugar: String
var add: String
}
}
}

三、首頁訂購者名字的傳送:

這邊有個特別的地方是,我是在第一頁就讓訂購人輸入名字,但一直到第三頁才要上傳資料;這邊特別問了彼得大大,你需要把資料從第一頁傳到第二頁再傳到第三頁。

首頁:拉IBSegueAction,將資料傳到第二頁。

class homePageViewController: UIViewController {
//輸入訂購人姓名的textfield
@IBOutlet weak var orderName: UITextField!

override func viewDidLoad() {
super.viewDidLoad()

// Do any additional setup after loading the view.
}
//資料傳遞
@IBSegueAction func orderNamePass(_ coder: NSCoder) -> drinksTableViewController? {
let controller = drinksTableViewController(coder: coder)
controller?.orderNamePass = orderName!.text
return controller

}

第二頁:資料傳遞,同樣拉IBSegueAction,將資料傳到第三頁。

class drinksTableViewController: UITableViewController {
//設定承接前頁的資料
var orderNamePass:String!
...(中間省略)
}
//重點是將第二頁的飲料資料及訂購人名稱都傳到第三頁。
@IBSegueAction func showDetail2(_ coder: NSCoder) -> detailViewController? {
let controller = detailViewController(coder: coder)
if let row = tableView.indexPathForSelectedRow?.row {
controller?.item = items[row]
controller?.orderNameLoad = orderNamePass
}
return controller
}

第三頁:資料的上傳

這邊我也是卡無敵久,我先測試簡單的文字可以上傳後,我才開始改uploadItem的內容。

大家可以多使用print,雖然知道錯誤的地方,但我也是繞圈圈很久。

import UIKit
import Kingfisher

class detailViewController: UIViewController {
var item: DrinksBody.Record?
var uploadItem: APIResponse.Record.Fields?
var orderNameLoad: String?



//飲料資訊顯示串
@IBOutlet weak var nameLabel: UILabel!
@IBOutlet weak var contentLabel: UILabel!
@IBOutlet weak var imageView: UIImageView!
@IBOutlet weak var shadowView: UIView!
@IBOutlet weak var MpriceLabel: UILabel!
@IBOutlet weak var LpriceLabel: UILabel!

//飲料資料串
@IBOutlet weak var sizeSelect: UISegmentedControl!
@IBOutlet weak var temperatureSelect: UISegmentedControl!
@IBOutlet weak var iceSelect: UISegmentedControl!
@IBOutlet weak var sugarSelect: UISegmentedControl!
@IBOutlet weak var addSelect: UISegmentedControl!


override func viewDidLoad() {
super.viewDidLoad()

//資料顯示設定
nameLabel.text = item?.fields.name
contentLabel.text = item?.fields.content
imageView.kf.setImage(with: item?.fields.image.first?.url)
if let mPrice = item?.fields.mPrice {
MpriceLabel.text = "\(mPrice)元"
} else {
MpriceLabel.text = "--"
}
//因為大杯價格並不是每個品項都有,在這裡寫了if判斷式;
if let lPrice = item?.fields.lPrice {
LpriceLabel.text = "\(lPrice)元"
} else {
LpriceLabel.text = "--"
}
// Do any additional setup after loading the view.
}

//設定送出的action為上傳資料
@IBAction func upLoadData(_ sender: Any) {
let url = URL(string: "https://api.airtable.com/v0/appQsJ6iAJq3CaPCQ/order")!
var request = URLRequest(url: url)
request.httpMethod = "POST"
request.setValue("Bearer patxlPE80KDVKhgMz.71205be764322888e0dd534c33d8dd489be78efda1e06eb47a687cb3df8d82e5", forHTTPHeaderField: "Authorization")
request.setValue("application/json", forHTTPHeaderField: "Content-Type")


let uploadItem = APIResponse.Record.Fields(
orderName: orderNameLoad ?? "",
drinkName: nameLabel.text ?? "",
size: sizeSelect.titleForSegment(at: sizeSelect.selectedSegmentIndex) ?? "",
temperature: temperatureSelect.titleForSegment(at: temperatureSelect.selectedSegmentIndex) ?? "",
ice: iceSelect.titleForSegment(at: iceSelect.selectedSegmentIndex) ?? "",
sugar: sugarSelect.titleForSegment(at: sugarSelect.selectedSegmentIndex) ?? "",
add: addSelect.titleForSegment(at: addSelect.selectedSegmentIndex) ?? "")

let apiresponse = APIResponse.Record(fields: uploadItem)

do {
let encoder = JSONEncoder()
let data = try encoder.encode(apiresponse)
request.httpBody = data

URLSession.shared.dataTask(with: request) { data, response, error in
if let error = error {
print("Error API: \(error)")
return
}

if let data = data {
if let responseString = String(data: data, encoding: .utf8) {
print("API Response: \(responseString)")
}
}
}.resume()
} catch {
print("Error encoding order data: \(error)")
}
}
}

送上github連結。

--

--

HydeeChen
彼得潘的 Swift iOS / Flutter App 開發教室

純種文組生轉職程式異世界 持續學習swift, Objective C, flutter…