1. 分析原型
要做的页面是一个UITableView加UISearchController
2. UITabelViewUITableView就分为四种cell 使用.plain类型就好
普通城市就可以用自带的cell
热门城市 当前城市和最近城市就必须自定义cell了
在数据源方法里采用indexPath创建不同种类cell即可
数据通过加载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 }github地址:
https://github.com/SoolyChristy/SoolyCitySelector
,论文