Swift.國家/地區(qū)區(qū)號選擇器

效果圖

實現(xiàn)功能:

  • 中英文雙語毙沾,根據(jù)系統(tǒng)語言獲取不同源內(nèi)容归形,以及不同的提示語言。

  • 通過閉包回調(diào)葵孤,點擊后將選中國家和區(qū)號以不同字段回調(diào)担钮。

  • 帶有SearchBar,實現(xiàn)即時搜索功能。

實現(xiàn)方式:

  1. 獲取數(shù)據(jù)源plist文件尤仍,英語/中文各一個文件箫津。并將文件中的數(shù)據(jù)以array/dictionary的形式存儲.

  2. 新建viewController,添加tableView將數(shù)據(jù)展示.

  3. 新建UISearchController宰啦,并實現(xiàn)UISearchResultsUpdating代理方法苏遥。

  4. 實現(xiàn)點擊cell方法,實現(xiàn)閉包回調(diào)赡模。

  5. 獲取系統(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語言的朋友可以看下這個項目杠步。

有問題歡迎探討.

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市榜轿,隨后出現(xiàn)的幾起案子幽歼,更是在濱河造成了極大的恐慌,老刑警劉巖谬盐,帶你破解...
    沈念sama閱讀 211,743評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件甸私,死亡現(xiàn)場離奇詭異,居然都是意外死亡飞傀,警方通過查閱死者的電腦和手機皇型,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來助析,“玉大人犀被,你說我怎么就攤上這事⊥饧剑” “怎么了寡键?”我有些...
    開封第一講書人閱讀 157,285評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長雪隧。 經(jīng)常有香客問我西轩,道長,這世上最難降的妖魔是什么脑沿? 我笑而不...
    開封第一講書人閱讀 56,485評論 1 283
  • 正文 為了忘掉前任藕畔,我火速辦了婚禮,結(jié)果婚禮上庄拇,老公的妹妹穿的比我還像新娘注服。我一直安慰自己,他們只是感情好措近,可當(dāng)我...
    茶點故事閱讀 65,581評論 6 386
  • 文/花漫 我一把揭開白布溶弟。 她就那樣靜靜地躺著,像睡著了一般瞭郑。 火紅的嫁衣襯著肌膚如雪辜御。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,821評論 1 290
  • 那天屈张,我揣著相機與錄音擒权,去河邊找鬼袱巨。 笑死,一個胖子當(dāng)著我的面吹牛碳抄,可吹牛的內(nèi)容都是我干的愉老。 我是一名探鬼主播,決...
    沈念sama閱讀 38,960評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼纳鼎,長吁一口氣:“原來是場噩夢啊……” “哼俺夕!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起贱鄙,我...
    開封第一講書人閱讀 37,719評論 0 266
  • 序言:老撾萬榮一對情侶失蹤劝贸,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后逗宁,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體映九,經(jīng)...
    沈念sama閱讀 44,186評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,516評論 2 327
  • 正文 我和宋清朗相戀三年瞎颗,在試婚紗的時候發(fā)現(xiàn)自己被綠了件甥。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,650評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡哼拔,死狀恐怖引有,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情倦逐,我是刑警寧澤譬正,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站檬姥,受9級特大地震影響曾我,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜健民,卻給世界環(huán)境...
    茶點故事閱讀 39,936評論 3 313
  • 文/蒙蒙 一抒巢、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧秉犹,春花似錦蛉谜、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至筑辨,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間幸逆,已是汗流浹背棍辕。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評論 1 266
  • 我被黑心中介騙來泰國打工暮现, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人楚昭。 一個月前我還...
    沈念sama閱讀 46,370評論 2 360
  • 正文 我出身青樓栖袋,卻偏偏與公主長得像,于是被迫代替她去往敵國和親抚太。 傳聞我的和親對象是個殘疾皇子塘幅,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,527評論 2 349

推薦閱讀更多精彩內(nèi)容

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對...
    cosWriter閱讀 11,092評論 1 32
  • 1、通過CocoaPods安裝項目名稱項目信息 AFNetworking網(wǎng)絡(luò)請求組件 FMDB本地數(shù)據(jù)庫組件 SD...
    陽明先生_X自主閱讀 15,969評論 3 119
  • 感恩媽媽讓我看到父母深沉沒有盡頭的對子女的愛尿贫,我們無論長多大如果過的不順利還是會操我們的心电媳,媽因為妹甘做剩女的事常...
    寸心潔白閱讀 266評論 0 3
  • 放假也一個多星期了。電腦壞的庆亡,蝸在家里看電視,熬時間匾乓。這電視劇看了不少,感慨頗深. 是啊又谋,人的一生要做什么事...
    小蚊子powr閱讀 205評論 0 1