如何使用UISearchBar搜索MKMapView?

2024-01-01

我有一个应用程序需要具有类似的搜索功能,例如 Apple“地图”应用程序(iPhone、iPod Touch 和 iPad 附带)。

有问题的功能应该不是一件难事,但我真的不知道如何在搜索栏中输入街道地址,然后获取该地址的坐标或可以帮助我实际移动地图的东西以那个地方为中心。

我的意思是,我要查询什么,苹果是否提供了“地址搜索API方法”?或者我需要直接使用谷歌地图API?

我很想听听应该如何完成。


好吧,回答我自己的问题:

正如之前提到的,最好的办法是使用 Google Maps API, 它支持很多格式,但出于多种原因我选择使用 JSON。

以下是对 Google 地图执行 JSON 查询并获取查询坐标的步骤。请注意,并未完成所有正确的验证,这只是概念证明。

1)下载iPhone的JSON框架/库,有几个,我选择了this one http://code.google.com/p/json-framework/,它非常好,似乎是一个活跃的项目,而且几个商业应用程序似乎正在使用它。因此,将其添加到您的项目中(说明here http://code.google.com/p/json-framework/wiki/InstallationInstructions ).

2) 要查询 Google 地图的地址,我们需要构建一个如下所示的请求 URL:http://maps.google.com/maps/geo?q=Paris+France http://maps.google.com/maps/geo?q=Paris+France

此 url 将返回查询“Paris+France”的 JSON 对象。

3) Code:

//Method to handle the UISearchBar "Search", 
- (void) searchBarSearchButtonClicked:(UISearchBar *)theSearchBar 
{
    //Perform the JSON query.
    [self searchCoordinatesForAddress:[searchBar text]];

    //Hide the keyboard.
    [searchBar resignFirstResponder];
}

处理完 UISearchBar 搜索后,我们必须向 Google 地图发出请求:

- (void) searchCoordinatesForAddress:(NSString *)inAddress
{
    //Build the string to Query Google Maps.
    NSMutableString *urlString = [NSMutableString stringWithFormat:@"http://maps.google.com/maps/geo?q=%@?output=json",inAddress];

    //Replace Spaces with a '+' character.
    [urlString setString:[urlString stringByReplacingOccurrencesOfString:@" " withString:@"+"]];

    //Create NSURL string from a formate URL string.
    NSURL *url = [NSURL URLWithString:urlString];

    //Setup and start an async download.
    //Note that we should test for reachability!.
    NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url];
    NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];

    [connection release];
    [request release];
}

当然,我们必须处理 GoogleMaps 服务器的响应(注意:缺少很多验证)

//It's called when the results of [[NSURLConnection alloc] initWithRequest:request delegate:self] come back.
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data 
{   
    //The string received from google's servers
    NSString *jsonString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];

    //JSON Framework magic to obtain a dictionary from the jsonString.
    NSDictionary *results = [jsonString JSONValue];

    //Now we need to obtain our coordinates
    NSArray *placemark  = [results objectForKey:@"Placemark"];
    NSArray *coordinates = [[placemark objectAtIndex:0] valueForKeyPath:@"Point.coordinates"];

    //I put my coordinates in my array.
    double longitude = [[coordinates objectAtIndex:0] doubleValue];
    double latitude = [[coordinates objectAtIndex:1] doubleValue];

    //Debug.
    //NSLog(@"Latitude - Longitude: %f %f", latitude, longitude);

    //I zoom my map to the area in question.
    [self zoomMapAndCenterAtLatitude:latitude andLongitude:longitude];

    [jsonString release];
}

最后是缩放地图的功能,这现在应该是一件微不足道的事情。

- (void) zoomMapAndCenterAtLatitude:(double) latitude andLongitude:(double) longitude
{
    MKCoordinateRegion region;
    region.center.latitude  = latitude;
    region.center.longitude = longitude;

    //Set Zoom level using Span
    MKCoordinateSpan span;
    span.latitudeDelta  = .005;
    span.longitudeDelta = .005;
    region.span = span;

    //Move the map and zoom
    [mapView setRegion:region animated:YES];
}

希望这对某人有帮助,因为 JSON 部分很难弄清楚,在我看来,该库的记录不是很好,但它仍然非常好。

EDIT:

由于@Leo 问题,将一种方法名称修改为“searchCooperativesForAddress:”。我不得不说,这种方法作为概念证明很好,但如果您计划下载大 JSON 文件,则必须附加到 NSMutableData 对象以保存对 google 服务器的所有查询。 (请记住,HTTP 查询是分段进行的。)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用UISearchBar搜索MKMapView? 的相关文章

  • Swift 数组设置索引值不起作用

    我有一个方法 下面的内容 其中queue2只是一个 Int 我打印了很多东西 看看一切是否都正常 public func cool item Int println item println back queue2 insert item
  • 如何等待 webViewDidFinishLoad 完成

    我有一个初始化 webView 的布尔条件 并在 webViewDidFinishLoad 中加载另一个委托 以便在完成完成后触发 但是 由于布尔值在条件 webViewDidFinishLoad 之前返回 因此页面永远不会完全加载 如何确
  • iOS 4.2.1 丢失文件?

    这是我第一次使用最新的 xcode 3 2 5 和新的 iOS 4 2 1 当我在设备上运行应用程序时 我收到以下运行时错误 无法读取 Developer Platforms iPhoneOS platform DeviceSupport
  • 使用 UIActionSheet 更改视图时工具栏项目消失

    当从 a 启动视图时UIActionSheet按钮 通过导航栏后退按钮返回视图后 工具栏虽然仍然可见 但上面没有任何以前的按钮 自从更新到 iOS 6 以来 这个错误就出现了 并且是在模拟器和仅运行 iOS 6 的设备上测试时发生的 如果我
  • 如何在 RestKit 中为同一类提供两条发布路线

    由于我无法弄清楚如何为同一个类设置两个不同的 POST 资源路径 因此我尝试手动创建 RKObjectLoader 请求 但它似乎不断发送 GET 请求而不是 POST 即使我已将方法设置为邮政 这是我的代码 User user User
  • iOS 开发: [[self navigationController] viewControllers]; 有哪些原因?会返回零吗?

    以下语句返回零 NSArray viewControllersInNavStack self navigationController viewControllers 这个语句是在导航堆栈中大约四层深度的视图控制器中调用的 所以我不明白它如
  • iOS:从非图像数据生成图像(Godus,如风景)

    所以看到图像后Godus http www kickstarter com projects 22cans project godus我想知道如何生成简单的 非交互式的 2D 图像 with 不同高度或层数的颜色不同就像下面的图片一样 我只
  • 自动布局和ios5

    我正在使用故事板 我已经使用了自动布局 但它不适用于 ios5 并且会崩溃 所以我想删除它 但是 如何取消选中自动布局 但如果我取消选中自动布局 我如何为 iPhone 4 和 5 设置屏幕 Regards 您可以在 IB 中禁用自动布局
  • Swift:从自定义 UITableViewCell 中的 UITextField 检索文本并将其放入数组中

    我正在制作一个非常简单的应用程序 用户在第一个屏幕中输入人数 在第二个屏幕中 它会生成一些UITableViewCell基于用户在第一个屏幕中输入的数字 这UITableViewCell have a UITextField在其中 一旦用户
  • UIBezierPath 的起始和结束角度?

    我在 iOS 中使用如下代码编写了半圆UI贝塞尔路径 and CAShape层 clockWiseLayer CAShapeLayer alloc init CGFloat startAngle M PI 2 CGFloat endAngl
  • 从 RemoteIO 保存音频的示例?

    我进行了搜索 但没有找到任何从 RemoteIO 音频单元保存音频的好示例或教程 我的设置 使用 MusicPlayer API 我有几个 AUSamplers gt MixerUnit gt RemoteIO 音频播放效果很好 我想添加将
  • 如何将十六进制数组转换为 UIImage?

    有几个与使用 P25mi 动态打印图像相关的未解答问题 没有一个得到公认的答案 下面有几个链接 如何将图像转换为位图代码以便在 iPhone 中进行蓝牙打印 https stackoverflow com questions 1383828
  • 在 Swift 中检查一个数组是否包含另一个数组的所有元素

    我想为数组编写一个扩展来检查一个数组是否包含另一个数组的所有元素 在我的用例中它是字符串对象 但我一直得到 Cannot convert value of type T Generator Element to expected argum
  • 在模拟器中运行应用程序时删除本地通知的 iOS 权限警报

    我正在尝试编写验收测试KIF https github com kif framework KIF在一个很早就要求本地通知权限的应用程序上 不幸的是 由于 iOS 模拟器安全原因无法使用 KIF 自动接受 iOS 权限警报 https gi
  • Cognito/IAM 策略和 S3 获取对象

    我正在尝试将 S3 和 Cognito 集成到我的 iOS 应用程序中 但到目前为止尚未成功 我相信该错误与我针对 Auth 和 Unauth 用户的 IAM 策略有关 所以这是我的政策 Version 2012 10 17 Stateme
  • 具有多种自定义单元格类型的 RxSwift 表视图

    我想知道是否有任何代码示例RxSwift当我可以在一个表视图中使用多个自定义单元格时 例如 我有两个部分 第一部分有 10 个单元格 类型为CellWithImage标识符和第二部分有 10 个带有类型的单元格CellWithVideo标识
  • 为什么 GDB 调试器不断冻结 Xcode 4?

    这真是一个奇怪的错误 我正在开发一个使用相机源的 iPhone 项目 并通过 OpenGL 着色器运行它以对其应用效果 然而 每次我在代码中简单地创建一个新的 GLfloat 时 调试器都会在启动时冻结 我无法复制和粘贴文本 因为整个 XC
  • 应用未能及时恢复

    我在一个非常具体的场景中遇到 未能及时恢复 崩溃 我认为与看门狗相关 仅在从后台恢复时 并且仅在进入后台后在很短的时间内执行此操作 a最多几秒钟 这似乎是相关的崩溃日志 Incident Identifier E30F2238 5B15 4
  • iOS 发送 iMessage 尽可能简单

    我希望能够以编程方式发送 iMessage 除了调用一个将文本发送到带有消息的号码的函数之外 无需执行任何其他操作 这两个消息都是文本框 我真的很感激一些示例代码 因为我在网上搜索过 但我发现没有任何帮助 这不适用于商业应用程序 仅适用于我
  • 通用类不会将委托调用转发给具体子类

    鉴于以下情况 protocol EntityType var displayString String get extension String EntityType var displayString String return self

随机推荐

  • 数组内的多个嵌套组

    我在 MongoDB 中有一组元素 如下所示 1 id ObjectId 58736c7f7d43c305461cdb9b Name Kevin pb event event type Birthday event date 2014 08
  • Bootstrap 模态动态内容

    我需要一种方法来加载可以随时更改的动态内容 根据 Bootstrap 文档 a href remote htm Click me a 正在利用 jQuerys load仅加载内容once 它将内容注入到 modal content div
  • 避免在 R 中的 cut 函数中使用科学记数法

    如何避免在 cut 函数创建的区间中出现科学记数法 a lt seq 10000 50000 by 500 cut a breaks seq 0 max a 300 by 300 我已经尝试过以下方法 但没有帮助 options scipe
  • MonoTouch、Sharepoint Web 服务和 xs:any

    有人接到网络服务电话上班吗与 SharePoint与 MonoTouch MonoDevelop Mono 一起操作 我能够从典型端点 本例中为 vti bin Lists asmx 获取 WSDL 并且 MonoDevelop 按预期创建
  • jQuery:如何获取选中的单选按钮的索引

    我最近发现了一个 StackOverflow 答案 其中给出了关于如何使用 jQuery 获取选中的单选按钮的值 https stackoverflow com questions 596351 how can i get which ra
  • Bootstrap 3 RC 1 中的 typeahead JavaScript 模块在哪里?

    如您所知 Bootstrap RC 1 已经发布 我一直在阅读这个新框架中所有令人敬畏的新功能 但你猜怎么着 打字头不在文档中 有谁知道这是否是出于任何原因 I found 这些例子 http twitter github io typea
  • Java如何将2011-11-06T14:34:16.679+02:00设置为XMLGregorianCalendar

    我正在构建 JAXWS 客户端 方法之一是获取 XMLGregorianCalendar 现在我需要格式化这些数据2011 11 06T14 34 16 679 02 00设置为 XMLGregorianCalendar 如何做呢 该日期是
  • 单个 SQL Server 表上的死锁

    我正在使用 SQL Server 2008 Enterprise 并使用ADO Net C Net 3 5 ASP Net作为客户端访问数据库 当我访问 SQL Server 2008 表时 我总是从 C ADO Net 代码调用存储过程
  • 更改视频时如何运行插件/库?

    执行代码时videoJS plugin取代了HTML5视频播放器 真的很高兴 我在我之间说了我所取得的成就 但是当点击下一个视频时 即使返回到第一个视频 plugin丢失了 让我成为默认玩家HTML5 你可以检查一下jsfiddle htt
  • 左侧的 HTML 元素滚动条[重复]

    这个问题在这里已经有答案了 可能的重复 DIV 左侧垂直滚动条 https stackoverflow com questions 1455708 div vertical scroll bar on left 有没有办法使用 css 或
  • 特定数据符合时间序列的标准是什么?

    我想做的是尝试检测天气数据集是否是时间序列 我想自动化这个过程 假设我有以下数据集 df1 Heading 1 Heading 2 Heading 1 Heading 2 1 1 2023 34 12 34 2 1 2023 42 99 4
  • Python urllib3:一段时间后关闭空闲连接

    有没有办法告诉Python urllib3在一段时间后不要重用空闲连接 而是关闭它们 寻找https urllib3 readthedocs io en latest reference index html module urllib3
  • 对于制服和顶点属性来说,OpenGL 索引和位置是一样的吗?

    在 OpenGL 参考页中 some https www opengl org sdk docs man4 html glUniform xhtml函数被标记为使用统一位置 而other https www opengl org sdk d
  • Vue - 多个无线电输入,检查值?

    我在创建一个简单的民意调查生成器时学习 vue 但我在无线电输入方面遇到了问题 问题可以有两种类型之一 选择或范围 两者都是无线电输入 选择 是无线电输入单选问题 范围 是具有 1 5 个值的无线电输入问题 如下图所示 稍后我必须修复命名
  • 在“for”循环java中重新启动当前迭代

    我有一个 for 循环 要求用户输入一个数字 然后对其执行 10 次操作 我想要一个内置的检查 如果用户输入不接受的输入 循环应该重新启动当前的迭代 例如 如果用户在第 3 轮中输入错误 则应重新启动第 3 轮 我怎么做 java中有类似R
  • Unicode 数字的字符类

    我需要创建一个Pattern它将匹配所有 Unicode 数字和字母字符 到目前为止我已经 p IsAlphabetic 0 9 第一部分对我来说效果很好 它很好地将非拉丁字符识别为字母字符 问题出在后半段 显然它只适用于阿拉伯数字 字符类
  • Angular 2:模板解析错误:无法绑定到“ngModel”,因为它不是“输入”的已知属性

    当我使用双向绑定 ngModel 时收到此消息 Template parse errors Can t bind to ngModel since it isn t a known property of input 我知道导入 Forms
  • 免费 API 或类似工具可获取股票的下一个收益日期 [已关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个 API 或类似的 API 我可以在其中获取股票的下一个 即将到来的 收益日期 我已经用
  • 在播放视频/流时选择 ROI

    如果有人可以帮助我在视频流播放时选择 ROI 我不希望它暂停或捕获第一帧 我将不胜感激 我错过了什么吗 我尝试将框架设置为相同的名称 cv2 selectROI Frame frame False cv2 imshow Frame fram
  • 如何使用UISearchBar搜索MKMapView?

    我有一个应用程序需要具有类似的搜索功能 例如 Apple 地图 应用程序 iPhone iPod Touch 和 iPad 附带 有问题的功能应该不是一件难事 但我真的不知道如何在搜索栏中输入街道地址 然后获取该地址的坐标或可以帮助我实际移