實現(xiàn)功能:
中英文雙語毙沾,根據(jù)系統(tǒng)語言獲取不同源內(nèi)容归形,以及不同的提示語言。
通過閉包回調(diào)葵孤,點擊后將選中國家和區(qū)號以不同字段回調(diào)担钮。
帶有SearchBar,實現(xiàn)即時搜索功能。
實現(xiàn)方式:
獲取數(shù)據(jù)源plist文件尤仍,英語/中文各一個文件箫津。并將文件中的數(shù)據(jù)以array/dictionary的形式存儲.
新建viewController,添加tableView將數(shù)據(jù)展示.
新建UISearchController宰啦,并實現(xiàn)UISearchResultsUpdating代理方法苏遥。
實現(xiàn)點擊cell方法,實現(xiàn)閉包回調(diào)赡模。
獲取系統(tǒng)語言暖眼,實現(xiàn)中英文自動匹配。
1.獲取數(shù)據(jù)源plist文件纺裁,英語/中文各一個文件。并將文件中的數(shù)據(jù)以array/dictionary的形式存儲.
/// 從plist文件中獲取數(shù)據(jù)并存儲
let sortedName = isLanguageEnglish() ? "sortedNameEN" : "sortedNameCH"
let path = Bundle.main.path(forResource: sortedName, ofType: "plist")
sortedNameDict = NSDictionary(contentsOfFile: path ?? "") as? Dictionary<String, Any>
indexArray = Array(sortedNameDict!.keys).sorted(by: {$0 < $1})
2.新建viewController司澎,添加tableView,實現(xiàn)tableView代理方法欺缘,將數(shù)據(jù)展示.
extension EWCountryCodeViewController:UITableViewDelegate,UITableViewDataSource{
func numberOfSections(in tableView: UITableView) -> Int {
if (searchController!.isActive) {
return 1;
} else {
return sortedNameDict?.keys.count ?? 0
}
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if searchController!.isActive {
return results.count
}else {
if indexArray!.count > section{
let array: Array<String> = sortedNameDict?[indexArray![section]] as! Array<String>
return array.count
}
}
return 0
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
guard let cell = tableView.dequeueReusableCell(withIdentifier: "identifier") else {
return UITableViewCell()
}
cell.textLabel?.font = UIFont.systemFont(ofSize: 16.0)
cell.selectionStyle = .none
cell.textLabel?.text = self.showCodeStringIndex(indexPath: indexPath as NSIndexPath)
return cell
}
func sectionIndexTitles(for tableView: UITableView) -> [String]? {
return indexArray
}
func tableView(_ tableView: UITableView, sectionForSectionIndexTitle title: String, at index: Int) -> Int {
return index
}
func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
return searchController!.isActive ? 0 : 30
}
/// 右側(cè)的篩選sectionTitle
func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
if ((indexArray?.count) != nil) && indexArray!.count > section {
return indexArray?[section]
}
return nil
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
self.selectCodeIndex(indexPath: indexPath)
}
}
3.新建UISearchController,并實現(xiàn)UISearchResultsUpdating代理方法挤安。并修改tableView代理方法谚殊,使其能夠顯示searchController的搜索結(jié)果
/// 當(dāng)searchResultsController為nil則意味著搜索結(jié)果使用原tableView展示
searchController = UISearchController(searchResultsController: nil)
searchController?.searchResultsUpdater = self
searchController?.dimsBackgroundDuringPresentation = false
searchController?.hidesNavigationBarDuringPresentation = false
searchController?.searchBar.placeholder = isLanguageEnglish() ? "Search" : "搜索"
extension EWCountryCodeViewController: UISearchResultsUpdating{
/// searchResults代理方法,將搜索到的內(nèi)容加入resultArray 賦給tableView
func updateSearchResults(for searchController: UISearchController) {
if results.count > 0 {
results.removeAll()
}
let inputText = searchController.searchBar.text
let array: Array<Array<String>> = Array(sortedNameDict!.values) as! Array<Array<String>>
for (_, obj) in array.enumerated() {
for (_, obj) in obj.enumerated() {
if obj.contains(inputText ?? ""){
self.results.append(obj)
}
}
}
tableView.reloadData()
}
}
4. 實現(xiàn)點擊cell方法蛤铜,實現(xiàn)閉包回調(diào)嫩絮。
private func selectCodeIndex(indexPath: IndexPath){
let originText = self.showCodeStringIndex(indexPath: indexPath as NSIndexPath)
let array = originText.components(separatedBy: "+")
let countryName = array.first?.trimmingCharacters(in: CharacterSet.whitespaces)
let code = array.last
if self.backCountryCode != nil {
self.backCountryCode!(countryName ?? "", code ?? "")
}
searchController?.isActive = false
searchController?.searchBar.resignFirstResponder()
self.navigationController?.popViewController(animated: true)
}
5. 獲取系統(tǒng)語言丛肢,實現(xiàn)中英文自動匹配。
/// 獲取系統(tǒng)語言方法
fileprivate func getCurrentLanguage() -> String {
let preferredLang = Bundle.main.preferredLocalizations.first! as NSString
switch String(describing: preferredLang) {
case "en-US", "en-CN":
return "en"http://英文
case "zh-Hans-US","zh-Hans-CN","zh-Hant-CN","zh-TW","zh-HK","zh-Hans":
return "cn"http://中文
default:
return "en"
}
}
調(diào)用方法:
let vc = EWCountryCodeViewController()
vc.backCountryCode = { [weak self] country, code in
self?.showCountryLabel.text = country
self?.showCodeLabel.text = code
}
self.navigationController?.pushViewController(vc, animated: true)
github地址: EWCountryCode
項目改自O(shè)C項目:XWCountryCode剿干,我遇到這個需求蜂怎,參考這個項目將其修改為了Swift版本,并修改了其一點小bug置尔,有興趣或者使用OC語言的朋友可以看下這個項目杠步。
有問題歡迎探討.