文章前提
这周公司项目有个需求,使用百度地图SDK搜索周边,需要实现跨城市搜索(切换城市)。需要有一个搜索城市的页面。
效果图
先把效果图附上来,各位看官看看符不符合需求。
实现步骤
这里简单说一下实现的步骤。
数据
首先说明,本篇文章提供的数据应该只有地级市,不含县级市,因为数据来源于网络。
我觉得这个功能最重要点就是数据了,有了数据相信大家都能做出来。数据来源于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,资源转化的每个步骤以及生成的转化后的文件都在里面了。
最后的最后:本文地址