Implementing a Search Bar

首先要從新思考 Design,把原來 plist 資料直接顯示在畫面的,要抽離出來,另外放到 NSDictionary ,如此才能讓使用者查詢時候,將資料過濾過再顯示在畫面上。
每次搜尋條件清空,開設 method mutableDeepCopy 要將 NSMutableDictionary 重新再 copy 重來一次。
針對 SectionsViewController.h header file 重新整理一番。開出 UITableView 將畫面可以在 Xcode 做些控制,例如 reload data, UISearchBar 新加入搜尋列, NSDictionary 將 plist 內容讀出放到這, NSMutableDictionary 將資料拆成 Mutable Dictionary, NSMutableArray 用來控制 key, BOOL isSearching 來告知目前是否正在搜尋,可以幫助一些判斷用。
修改 View,加入 UISearchBar,並且提供 cancel 按鈕。另外將相關的 Outlet 都串聯起來,作為後面 delegate 時候所需。
再來要針對 SectionsViewController.m 裡面來重新調整一番和覆寫些 delegate 的 method。有三個區域 Table View Data Source methods、Table VIew Delegate methods 和 Search Bar Delegate methods 等等。
在 github 平台上面,我開設了一個 Section project,透過 tag 紀錄來切出練習題的版本出來。剛好 github 這邊功能很貼心,可以列出每次 commit 和前次的差異,所以我們從這個紀錄統計可以看出,有 6 個變更檔案要介紹。並且透過 https://github.com/edwardinubuntu/Sections/commit/ 這一次 commit 頁面解析,紅色為移除掉程式碼,綠色是新增程式碼。再搭配前面描述那些步驟順序對照,即可很清出看出修改上的差異了。
開發上要注意到,在加入這些 delegate 所需要的 method 時候,命名上大小寫要小心,不然在測試時候,會跑不出要的特效。所以在相關行數加入中斷點 break points 並且使用 debug mode 來跑,才能確定程式都有跑到,例如需要 searchBarSearchButtonClicked, searchBar: textDidChange:, searchBarCancelButtonClicked:, searchBarTextDidBeginEditing: 等等各種觸發事件。另外寫的時候,如果有宣告 IBOutlet,在 Interface Builder 要記得將這些串聯起來,不然會發生程式明明都有寫對,為什麼開啓模擬器測試,卻畫面沒有出現預期的效果。
以上除了可以參考書本 Beginning iPhone 3 Development 章節 Implementing a Search Bar,程式碼完整收錄在 edwardinubuntu/sections,tag v0.1 有右手邊的 index 輔助查詢、tab v0.2 加入搜尋輸入欄讓搜尋資料過濾更容易。
Comments
Post a Comment