iOS全国城市搜索

444 阅读2分钟

head

文章前提

这周公司项目有个需求,使用百度地图SDK搜索周边,需要实现跨城市搜索(切换城市)。需要有一个搜索城市的页面。


效果图

先把效果图附上来,各位看官看看符不符合需求。

全部内容 普通搜索 拼音搜索
详细搜索 谐音搜索1 谐音搜索2

实现步骤

这里简单说一下实现的步骤。

数据

首先说明,本篇文章提供的数据应该只有地级市,不含县级市,因为数据来源于网络。

我觉得这个功能最重要点就是数据了,有了数据相信大家都能做出来。数据来源于GitHub的开源项目Administrative-divisions-of-China

然,下载下来会发现json数据是这样的。

[
    {
        "code": "1101",
        "name": "北京市",
        "provinceCode": "11"
    }, 
    {
        "code": "1201",
        "name": "天津市",
        "provinceCode": "12"
    }
]

黑人问号脸 这怎么用?我要的是按首字母分类的,而且内容还要按字母排序啊。这怎么玩?
算了,再找找其他的json资源吧。

其实不用灰心,只要稍微费点心,我们照样可以把这样的数据转化为我们需要的数据。

[
  {
    "A" : [
      {
        "name" : "阿坝藏族羌族自治州",
        "pinyin" : "a ba cang zu qiang zu zi zhi zhou"
      },
      {
        "name" : "阿克苏地区",
        "pinyin" : "a ke su de qu"
      },
      ···
      ···
    ]
  },
  {
    "B" : [
      {
        "name" : "白城市",
        "pinyin" : "bai cheng shi"
      },
      {
        "name" : "百色市",
        "pinyin" : "bai se shi"
      },
      ···
      ···
    ]
  },
  ···
  ···
]

看吧看吧,如果转化成这种格式,后面就不用我再说怎么做了吧。
别急,转化方法和最终的城市搜索页都在最后的demo中。

拼音

是不是很好奇?原始数据明明没有拼音啊,怎么搞出来的拼音?其实iOS提供的有这方面的API,只是可能平时用不到,才会感觉奇怪。

	NSString *text = @"这是一串汉字";
    // 要使用NSMutableString才能进行转化
    NSMutableString *pinyinText = [[NSMutableString alloc] initWithString:text];
    
    if (CFStringTransform((__bridge CFMutableStringRef)pinyinText, 0, kCFStringTransformMandarinLatin, NO)) {
    	// 这一步转化完之后已经是拼音了,是不过有声调
        NSLog(@"有声调的拼音:%@", pinyinText);
        
        // 去掉声调
        if (CFStringTransform((__bridge CFMutableStringRef)pinyinText, 0, kCFStringTransformStripDiacritics, NO)) {
            // 这里就是没有声调的拼音了
            NSLog(@"没有声调的拼音:%@", pinyinText);
        }
    }

搜索逻辑

搜索的代码逻辑就没什么好说的了,相信各位看官阅读代码的能力。(实在是垃圾代码太多,不好意思讲出来啊)

最后附上本篇文章的demo,资源转化的每个步骤以及生成的转化后的文件都在里面了。

最后的最后:本文地址