#Task:Part.04–新增帳務,搜尋附近地點

掌聲鼓勵👏🏻👏🏻👏🏻搜尋附近地點的功能出爐啦~首先說明一下這部分的功能:1.取得使用者位置、2.搜尋使用者附近地點、3.透過TableView顯示地點、4.輸入關鍵字過濾附近地點、5.選擇地點回傳名稱至前一頁。

我是使用Swift SDK(MapKit、CoreLocation)完成並沒有額外串接第三方API,所以功能比較簡單也有一些限制。以下會紀錄我是如何製作,如果有興趣就一起看下去吧!

取得使用者位置

定位的準備工作要先匯入CoreLocation、建立LocationManager偵測使用者位置變化、遵從CLLocationManagerDelegate,接著設定LocationManager的委任對象為目前的ViewController。

使用者位置授權也需要在Info.plist加上鍵才能正常使用。

準備完成後,實作CLLocationManagerDelegate的didUpdateLocations方法來取得使用者位置,取得使用者位置後就可以透過MKLocalSearchRequest和 MKLocalSearch取得附近地標景點,下段說明。

搜尋使用者附近地點

這個部分需要先匯入MapKit、建立LocalSearchRequest實作LocalSearch來搜尋。LocalSearchRequest可以搭配naturalLanguageQuery用自然語言的方式帶入參數來指定搜尋準則,例如store、hotel、coffee…而place為所有類型。LocalSearch呼叫start(completionHandler:)方法開始搜尋,搜尋完成後會回傳一個MKMapItem的Array但只會有10筆資料,所以我以心願記帳APP有可能的帳務地點類型寫成一個陣列,再利用迴圈把每一個關鍵字得到的資料放入同一個陣列作為搜尋結果。

透過TableView顯示地點

TableView必備雙寶!遵從UITableViewDelegate、UITableViewDataSource並實作裡面的方法。這邊想要提出來的紀錄部分是,我只想在Table顯示地點名稱和地點地址,地點名稱用searchResults[indexPath.row].name獲得,但地點地址則是在searchResults[indexPath.row].placemark.title,其實把結果印出來就可以很快找到想要的資料,但我還是在這裡卡了一下😂

在didSelectRowAt中透過delegate將地點名稱傳至前一頁,後面會說明。

輸入關鍵字過濾附近地點

之所以用“過濾”而不是“搜尋”是因為,這邊利用前面獲得的使用者附近地點中取得和關鍵字匹配的資料,而不是真正地可以搜尋地點,若使用者輸入不在附近地點之中的關鍵字將得不到任何結果。

輸入關鍵字的元件是SearchBar,必須遵從UISearchBarDelegate並實作textDidChange方法。當關鍵字為空時,會顯示所有使用者附近地點;當關鍵字有值時,會從使用者附近地點找出匹配的資料。

關於SearchBar還有實作另外兩個方法:searchBarSearchButtonClicked、searchBarCancelButtonClicked。SearchButton隱藏鍵盤;CancelButton清空SearchBar的文字並顯示回所有使用者附近地點。

選擇地點回傳名稱至前一頁

這是我第一次練習用delegate傳資料!簡單來說,在傳遞資料的Class定義Protocol並宣告要執行的Function,然後在獲得資料的Class遵從Protocol並實作Function。詳細步驟可參考彼得潘的說明,如下。

=====

大功告成!什麼功能先完成都是不可預計的呢🤪原本還說要放後面一點研究…但什麼感覺來就先做什麼吧~雖然只用Swift SDK來處理這部分不是那麼完美和完整,不過就算是用簡單的方法來實作也花了很多時間呢🥺

如果有什麼建議歡迎留言~有興趣可以取用我的檔案🙆🏻‍♀️

心願記帳Part.04到這邊結束,我會努力的🙇🏻‍♀️🙇🏻‍♀️🙇🏻‍♀️

未完待續,敬請期待…

--

--