1. 分析原型
效果圖
實現demo
要做的頁面是一個
UITableView
加UISearchController
2. UITabelView
UITableView
就分為四種cell
使用.plain
類型就好普通城市就可以用自帶的
cell
熱門城市 當前城市和最近城市就必須
自定義cell
了在數據源方法里利用
indexPath
創建不同種類cell即可數據通過加載plist文件即可
cities.plist
/// 懶加載 城市數據
lazy var cityDic: [String: [String]] = { () -> [String : [String]] in
let path = Bundle.main.path(forResource: "cities.plist", ofType: nil)
let dic = NSDictionary(contentsOfFile: path ?? "") as? [String: [String]]
return dic ?? [:]
}()
/// 懶加載 熱門城市
lazy var hotCities: [String] = {
let path = Bundle.main.path(forResource: "hotCities.plist", ofType: nil)
let array = NSArray(contentsOfFile: path ?? "") as? [String]
return array ?? []
}()
3. UISearchController
- 創建搜索控制器
/// 搜索控制器
lazy var searchVC: UISearchController = {
let searchVc = UISearchController(searchResultsController: self.searchResultVC)
searchVc.delegate = self
searchVc.searchResultsUpdater = self
// 不隱藏導航條
searchVc.hidesNavigationBarDuringPresentation = false
searchVc.definesPresentationContext = true
// 是否關閉蒙版
searchVc.dimsBackgroundDuringPresentation = false
searchVc.searchBar.frame = CGRect(x: 0, y: 0, width: ScreenWidth - 114, height: 44)
searchVc.searchBar.placeholder = "輸入城市名或拼音查詢"
searchVc.searchBar.delegate = self
return searchVc
}()
/// 搜索結果控制器
lazy var searchResultVC: ResultTableViewController = ResultTableViewController()
-
UISearchBar
加到導航條里若需修改搜索條的width
就必須先用一個view去接收再添加到導航條上
let titleView = UIView(frame: searchVC.searchBar.frame)
titleView.addSubview(searchVC.searchBar)
self.navigationItem.titleView = titleView
搜索邏輯 (支持拼音搜索)
-
先判斷
searchBar.text
是否含有中文字符,如果有- 將其轉為拼音 根據首字母在
cityDic["首字母"]
里遍歷查找 - 把數據傳給
searchResultsController
顯示數據即可
- 將其轉為拼音 根據首字母在
-
若沒有中文字符則進行拼音搜索
- 根據
searchBar.text
的首字母 將cityDic["首字母"]
里轉換為無空格的拼音遍歷查找即可 - 需要實現
bj => 北京 wh=> 武漢
此類搜索則分別獲取兩字的首字母即可 - 搜索不區分大小寫則調用
String
里的uppercased()
和lowercased()
對應將字符串轉為大寫和小寫
- 根據
中文轉拼音
func chineseToPinyin() -> String {
let stringRef = NSMutableString(string: self) as CFMutableString
// 轉換為帶音標的拼音
CFStringTransform(stringRef,nil, kCFStringTransformToLatin, false)
// 去掉音標
CFStringTransform(stringRef, nil, kCFStringTransformStripCombiningMarks, false)
let pinyin = stringRef as String
return pinyin
}