Swift-咖啡店App Part.3

兼距API串接與使用者資料儲存

--

前言:

趁2020第一天將part3.部分寫完,祝大家2020一切順利平安。

目前進度來到API串接部分,除了API串接外,也會針對登入後的menu頁面做點小小動畫,至於API串接會先API data的縣市去分類,選擇分類後顯示出一系列該縣市的咖啡店清單,點擊咖啡店可以顯示一些基本資訊與地圖,由於API data沒有提供照片的資料,這裡會以亂數產生預先放置的十八張照片。

Step1. menu頁面的動畫

單純的將網路資訊與私方店家分別從上與右方滑入,語法如下

在viewDidLoad先設定動畫初始位置與設定,同時在viewWillAppear時開始執行動畫,最後回到原有的位置,利用delay呈現不同時間點滑入的落差感!

Step2. 以縣市分類顯示

從API data得知每筆資料都有city這項資料,所以決定以縣市分類做為第一階的資料分類,經過近一步了解,部分縣市是合併成一個類別,如台北市新北市同時列為tapei、嘉義縣嘉義市同時列為chiayi等。

生成一個APIData的swift file,宣告名為APICities的struct,另外生成一個APICitiesBrain的swift file,宣告名為APICitiesBrain的struct,內容產生一個Cities的常數,以Dictionary形式存放欲顯示在第一階分類的table view上,同時考慮下一部分抓取資料所需的資訊。

此外,在圖片部分考慮到畫質部分,特地將檔案轉成pdf檔顯示。

為了設定成想要的cell形式,放上所需的元件並建立Auto Layout後,利用Cocoa Touch建立一個UITableViewCell的檔案,同時在其中建立所需的IBOutlet並套用上。

建立一個UITableViewController類別的檔案來產生第一階分類的表格,同時利用performSegue與prepare方式將選取顯示的en_name傳送至下一個頁面,用來串接對應縣市的資料。

Step3. 以列表方式顯示指定縣市的咖啡店清單

在APIData.swift增加struct APIData,內容為所需的API data項目

為了符合MVC原則,將串接API的程式碼大多寫在APICitiedBrain.swift,由於API的url資料都是以city的英文做結尾,故上一步驟才需特地將en_name傳到這一步驟。

Step3的概念是在viewDidLoad將上一步驟的en_name作為參數,執行抓取資料與解析資料的方法,再藉由自訂的protocol,利用tableView.reloadData()來更新表格。

cell顯示的內容及相關設定與Step2的方式大同小異。此外,當使用者點擊特定咖啡店時,一樣藉由prepare方式將資料傳到下一個頁面。

Step4. 詳細咖啡店資料

這一步驟要顯示店家基本資料,如地址、咖啡好喝程度、網站、地圖等,若是沒有的資訊就以空白顯示,而照片部分會與在列表時顯示的不同,目前找不到方法可以讓兩者相等。

此步驟選用UIViewController內容搭配table view的方式,而圖片則另外在table view上方利用view佔據一個空間顯示。

首先,在照片顯示上用一層background顏色為淡黑色的view蓋住,讓顯示的店家名稱較為明顯。

在cell顯示部分,利用Cocoa Touch建立所需不同形式的cell檔案,在tableView(_:cellForRowAt:)顯示cell內容時,用switch indexPath.row指定個欄位顯示的cell內容。

地圖部分,由於API data有提供經度與緯度,故在建立該欄位的cell時,需同時建立帶有經緯度參數的方法,tableView(_:cellForRowAt:)定義該欄位的cell時需執行對應方法。

當點擊地圖時會跳到全螢幕地圖的畫面,只需建立一個ViewController,放上MKMapView後,將相同帶有經緯度的方法寫在ViewController內,並在viewDidLoad內執行方法,經緯度資料則是利用prepare從detail頁面傳遞過來。

顯示網址的欄位在點擊後可開啟網頁,是利用SFSafariViewController來達成。

目前想到還能增加的功能分別為搜索功能與地圖顯示使用者位置,搜索功能還在測試當中,找了一些寫法都無法達成,打算暫且先擱置!後者則是可有可無,所以也先不增加!

下一階段準備開始著手私房店家的部分,原先預定是利用Core data來儲存資料,但又想挑戰看看Firebase的database!

附上gitHub連結與其他參考資料,有發現我寫法有錯的,麻煩告知!感謝!至於readME就先偷懶不更新了!

--

--