iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 12
1
Mobile Development

iOS APP 使用Swift打造一個外送平台APP (以foodpanda、Uber Eats為例) 系列 第 13

[Day 12] Swift 徵 幫寫 手機app - 模糊收尋 NSPredicate Like ( 下 )

簡要

上一篇已經完成Tag分類部分
只剩下模糊搜尋以及tableView顯示
這篇就來把剩下的完成

模糊搜尋

這裡標題使用NSPredicate
因為OC好像可以使用NSPredicate達成目標
Swift好像不行
可能要使用filter
filter可以用特定自去搜尋你所傳的文字
比如 我今天要洗澡打球睡覺
contains 睡覺 的話
就可以找到本文內有睡覺

filter

let ary = ["我要吃飯","打球","我今天要洗澡打球睡覺","睡覺"]
let resultAry = ary.filter {
    (str) -> Bool in return
    str.contains("睡覺")
}
print(resultAry)

打印出來可以找到所有有睡覺的文字字串
並且儲存在陣列裡面

["我今天要洗澡打球睡覺", "睡覺"]

這樣可以找字串就方便多了
可以把我們上一篇的Tag拿來找
Tag地下的文字都拿來找過一遍
找到的就存在陣列
並且顯示在tableView

  • 使用Tag底下的所有文字去filter輸入的行程表
  • 將搜尋到的存在陣列
  • 去除重複的行程
  • 顯示在tableView
let strokeStr = [strokeStr]
for i in objectArray.indices {
    for j in objectArray[i].sectionObjects.indices {
        // 搜尋所有Tag底下的文字
        let resultAry = strokeStr.filter {
            (str) -> Bool in return
            str.contains(objectArray[i].sectionObjects[j])
        }
        // 如果有找到符合的話執行
        if resultAry.count > 0 {
            if (filterArr[objectArray[i].sectionName] != nil) {
                var arr = filterArr[objectArray[i].sectionName]
                // 去除重複行程
                for k in arr!.indices {
                    if arr![k] == objectArray[i].sectionObjects[j] {
                        return
                    }
                }
                // 新增行程
                arr?.append(objectArray[i].sectionObjects[j])
                filterArr.updateValue(arr!, forKey: objectArray[i].sectionName)
             
            }else{
                // 創立Tag Key 並且 新增行程
                let arr = [objectArray[i].sectionObjects[j]]
                filterArr.updateValue(arr, forKey: objectArray[i].sectionName)
            }
        }
    }
}

完成以後就可以幫忙分類
單純分類而已

Demo
https://ithelp.ithome.com.tw/upload/images/20190927/20112271yCYLBTyal9.png

行程已完成

接下來處理已完成項目
使用上次的Alert事件
當按下確認以後
array的行程remove
並且updateValue
然後reload TableView

// 建立[確認]按鈕
let okAction = UIAlertAction(
    title: "確認",
    style: .default,
    handler: {
        (action: UIAlertAction!) -> Void in
        var arr = self.filterArr[self.tableArr[indexPath.section].sectionName]
        arr?.remove(at: indexPath.row)
        self.filterArr.updateValue(arr!, forKey: self.tableArr[indexPath.section].sectionName)
        self.tableArrInit()
})
alertController.addAction(okAction)

Demo
https://ithelp.ithome.com.tw/upload/images/20190927/20112271iHdoxgqWXj.png

全部就設置完畢了
Demo全部流程

新增Tag 文字

新增什麼文字
分類哪個Tag

新增Tag

以前沒有的Tag可以直接輸入新增
一樣會幫忙新增

新增行程

使用以下文字

個人有個小癖好 主要是因為本人有隨手記錄文字的習慣 但很多詞會重複、想要這個程式 擁有分類功能的並且可以自動分類我寫的詞屬於哪一個檔案 譬如我輸入「寫功課 洗衣服 看影片」按下更新之後就能將寫功課-歸類為課業 洗衣服歸類為待做事項、看影片歸類為娛樂. 假如我輸入「洗衣服 寫功課 看影片 寫功課」按下更新後自動屏蔽重複的字眼、只保留一次即可、詞語詞以空格為界 假如打錯字則將辨識不了的詞語顯示出來手動辨識

自動去我的Tag做分類

可過濾重複行程

這邊輸入重複的行程
以及沒重複的看結果

已完成行程

點選TableView跳出Alert
確認後刪除該Cell

以上大概是這次練習
寫成很急促雖然UI很醜
但是功能大部分自己都還算滿意


上一篇
[Day 11] Swift 徵 幫寫 手機app - 模糊收尋 NSPredicate Like (上)
下一篇
[Day 13] Swift TableView使用Section實現一次顯示多Cell功能
系列文
iOS APP 使用Swift打造一個外送平台APP (以foodpanda、Uber Eats為例) 31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言