MKMapView 注释更改/丢失顺序?

2024-03-20

我有一个带有注释的地图视图,这些注释显示标注。单击标注的公开详细信息按钮时,它会进入一个新视图。

我的 MKAnnotations 是一个自定义类,它实现<MKAnnotation>。我们将该类称为 MyClass。它们存储在 NSMutableArray 中。在此视图的 viewdidload 期间,我将此数组中的每个 MyClass 对象添加到地图视图的注释中。使用调试器,我可以看到,一旦完成所有这些添加,[self.MapView 注释] 顺序与 NSMutableArray 相同。

现在,我在 mapView:viewForAnnotation: 中设置了另一个断点:并检查 1) 我的 NSMutableArray 和 2) [self.MapView 注释] 的顺序。当然,数组的顺序是相同的。然而,注释的顺序已被打乱。

这对我来说是一个大问题,因为我需要使用用户在下一个视图中选择的 MyClass 的特定实例。又名,我想查看注释,找到它的索引,然后使用它来获取数组中的相同索引。

我现在意识到我可以直接保存注释(来自 Android 背景,这对我来说非常酷)。然而,我仍然在概念上不明白为什么订单会被打乱。有人能帮我吗?代码如下:

- (void)viewDidLoad
{


    if([fromString isEqualToString:@"FromList"])
        self.navigationItem.hidesBackButton = TRUE;
    else { 
        self.navigationItem.rightBarButtonItem = nil;
    }


    self.array = [MySingleton getArray];
    //set up map

    //declare latitude and longitude of map center
    CLLocationCoordinate2D center;
    center.latitude = 45;
    center.longitude = 45;

    //declare span of map (height and width in degrees)
    MKCoordinateSpan span;
    span.latitudeDelta = .4;
    span.longitudeDelta = .4;

    //add center and span to a region, 
    //adjust the region to fit in the mapview 
    //and assign to mapview region
    MKCoordinateRegion region;
    region.center = center;
    region.span = span;
    MapView.region = [MapView regionThatFits:region];

    for(MyClass *t in self.array){
        [MapView addAnnotation:t];
    }
    [super viewDidLoad];
}



//this is the required method implementation for MKMapView annotations
- (MKAnnotationView *) mapView:(MKMapView *)thisMapView 
             viewForAnnotation:(MyClass *)annotation
{


    static NSString *identifier = @"MyIdentifier";

    //the result of the call is being cast (MKPinAnnotationView *) to the correct
    //view class or else the compiler complains
    MKPinAnnotationView *annotationView = (MKPinAnnotationView *)[thisMapView 
                                                                  dequeueReusableAnnotationViewWithIdentifier:identifier];
    if(annotationView == nil)
    {
        annotationView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:identifier];
    }

    annotationView.pinColor = MKPinAnnotationColorGreen;

    //pin drops when it first appears
    annotationView.animatesDrop=TRUE;

    //tapping the pin produces a gray box which shows title and subtitle  
    annotationView.canShowCallout = YES;

    UIButton *infoButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
    annotationView.rightCalloutAccessoryView = infoButton;


    return annotationView;
}

你打电话时addAnnotation or addAnnotations,地图视图将引用添加到其内部注释列表中。

The annotations的财产MKMapView只是返回这个内部列表(无论它是什么类型)作为NSArray.

我不知道文档中有任何地方指出annotations属性按照您添加注释的顺序返回数组。如果您有showsUserLocation打开后,即使您没有显式添加该注释,数组也会包含该注释。

您不需要关心也不应该依赖于对象中对象的顺序annotations财产。

关于代码的一些建议:

  • 自从你的array包含实现的对象<MKAnnotation>,您可以通过调用一次性添加所有注释,而不是循环遍历它addAnnotations(复数)并将数组传递给它
  • In viewForAnnotation,您设置的所有属性都不依赖于任何特定注释,因此您可以将它们全部设置在if (av == nil)堵塞。这样您就可以获得最大程度的重用。
  • Also in viewForAnnotation,之后和之外if,你应该设置annotation视图的属性设置为当前注释。这是为了防止视图被另一个注释重用。
  • 最后,在viewForAnnotation,不要假设annotation将是类型MyClass。如果你打开showsUserLocation,情况不会是这样。将参数声明为更安全id<MKAnnotation>然后如果有必要检查它的类是什么,然后进行转换。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MKMapView 注释更改/丢失顺序? 的相关文章

  • 如何将“前往此处的路线”按钮添加到地址簿中?

    谷歌地图应用程序有 到这里的方向 和 从这里出发的方向 例如http static intomobile com wp content uploads 2008 10 iphone 22 os google maps street view
  • 在 UITableView 上显示徽章信息

    我希望在 UITableView 行上显示徽章信息 如下图所示 我尝试使用下面的代码 UILabel labelCell1 UILabel alloc init labelCell1 frame CGRectMake 160 9f 10 0
  • AVAudioPlayer只能在模拟器中播放,但不能在设备中播放,为什么?! (iPhone-SDK)

    我有以下播放声音的简单代码 NSString soundPath NSBundle mainBundle pathForResource sound ofType wav player AVAudioPlayer alloc initWit
  • 如何在iPhone应用程序中的类结构中实现主键和外键表数据[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 如何连接sqlite数据库中的两个表数据 if sqlite3 open dbPath UTF8String database SQL
  • UIButton 图像未更改/更新

    首先 我对 Objective C 还很陌生 并且仍在尝试尽可能多地学习 所以请耐心等待 现在我有一个以编程方式创建的 UIButton 按下按钮时 将显示一个 UIActionSheet 其中包含 相机 选择照片 或 取消 选项 然后 按
  • 从视频创建缩略图 - 提高速度性能 - AVAsset - iPhone [重复]

    这个问题在这里已经有答案了 我正在使用基于以下线程中的代码的代码来生成视频缩略图 从 iPhone SDK 中的视频 URL 或数据获取缩略图 https stackoverflow com questions 1347562 gettin
  • NSHTTPCookieStorage 是否跨应用程序持续存在?

    所以我只是好奇 NSHTTPCookieStorage 是否跨应用程序持久存在 或者仅在当前应用程序本地 我希望在另一个应用程序中收集的一些 cookie 可以在搜索应用程序中访问 是这样的吗 谢谢 PS 这是在 iPhone 或 iPad
  • iPhone 相当于 Application.DoEvents();

    iPHone 我们使用 MonoTouch 但 Obj C 答案还可以 我的单例域对象需要一段时间才能获取所有数据 因此它在线程中内部运行部分获取数据 我需要通知 UI 域已完成 目前我正在这样做 有没有更好的办法 在 WinForms 中
  • iphone - 自动释放,没有池 - 只是泄漏

    我的主代码中有这一行 self performSelectorInBackground selector animateMe withObject nil 这是 animateMe void animateMe UIView animate
  • 如何在 NSMutableArray 中实现“按值分组”?

    我正在使用 NSMutableArray 我想像在 SQL 中那样按日期获取值group by log date logMuArray log currenttime 4 30pm log date 11 12 2011 log durat
  • 在 Objective-C 中比较 2 个字符串

    我写了以下代码 if depSelectedIndice gt 1 comSelectedIndice gt 1 NSLog depart elemet d depSelectedIndice NSLog depart elemet d c
  • 从 UIImagePickerController 相机视图推送 viewController

    我正在开发一款消息应用程序 类似于 WhatsApp 用户可以互相发送文本和图像消息 当用户想要发送图像时 他可以从相机胶卷中选择一张图像 也可以用相机拍摄一张图像 这就是我介绍的方式UIImagePickerController对于这两种
  • iPhone 应用程序中的异步、同步、线程

    我正处于一个应用程序的设计阶段 该应用程序将利用 REST Web 服务 并且在使用异步 同步和线程方面遇到了困境 这是场景 假设您有三个选项可供深入研究 每个选项都有自己的基于 REST 的资源 我可以使用同步请求延迟加载每个请求 但这会
  • 使用 iPhone 中的地图视图读取当前位置名称

    我读取了当前位置的纬度和经度值 然后成功将该位置固定在 iPhone 中 现在我想使用这个纬度和经度值读取该地名 我使用以下代码来读取查找当前位置 void mapView MKMapView mapView1 didUpdateUserL
  • Parse.com 从相关 PFObject 获取 PFUser

    我正在将照片保存为 PFObject 解析 并使用 PFUser currentUser 用户 ID 作为其键之一 我想在表格视图中显示照片以及该 PFUser 的详细信息 但是当我尝试获取用户时 PFUser user self phot
  • 忽略触摸事件,让其下面的视图处理触摸?

    我有一个用户可以触摸的可拖动视图 但它的某些矩形将没有图像 alpha 0 当用户单击透明区域时 我能够在没有 alpha 信息的情况下构造透明区域 我希望透明区域下方的视图 同一类 来检测触摸 我的策略是当用户触摸透明区域时让视图忽略触摸
  • 在发生更改事件时将货币格式重新应用到 UITextField

    我正在使用一个包含本地化货币值的 UITextField 我看过很多关于如何使用此功能的帖子 但我的问题是 如何在每次按键后将货币格式重新应用到 UITextField 我知道我可以通过以下方式设置和使用货币格式化程序 NSNumberFo
  • iPhone X 将对象底部与安全区域对齐会破坏其他设备上的外观

    关于 iPhone X 自动布局怪癖的问题 我有两个按钮 以前这些按钮将与超级视图底部对齐 偏移量为 20 以免它们接触屏幕底部 此后我将链接更改为安全区域而不是超级视图 Here s the original setup Looks go
  • 未知异常和崩溃

    当我尝试快速滚动表格视图或从远程重新加载数据时 我的应用程序崩溃了 当我先进行远程获取然后滚动表格视图时 一切似乎都工作正常 我不知道下面的崩溃日志意味着什么 它只是有时工作正常 有时崩溃 Incident Identifier 710A1
  • 将 iPad xib 转换为 iPhone xib

    我看过很多关于将 iPhone xib 转换为 iPad xib 的帖子和教程 但我想反过来做 我能找到的唯一资源是 将 iPad 应用程序转换为 iPhone https stackoverflow com questions 68550

随机推荐

  • 使用实体框架记录每个数据更改

    客户需要将每个数据更改与进行修改的实际用户一起记录到日志表中 该应用程序使用一个 SQL 用户来访问数据库 但我们需要记录 真实 用户 ID 我们可以在 t sql 中通过为每个表插入和更新编写触发器并使用 context info 来存储
  • 从 C++ 中的给定文件点读取目录

    我有两个程序将同时读取 写入文件到同一目录 但不会同时读取 写入文件 我已经完成了写作部分 但我正在努力获得阅读目录部分的一半体面且有效的实现 目录中的文件遵循以下命名方案 Image INDEX KEY DEL TIMESTAMP IND
  • Azure Function CosmosDBTrigger 不可扩展

    我有一个带有 CosmosDBTrigger 的 Azure 函数 用于使用 Application Insights 监控的消费游戏 正在监控的集合有500 000插入更改提要中 消费计划将实例数量扩大到15几分钟之内 但只有第一个实例能
  • 使用 axios 递归获取数据并链接结果

    我有一个模式的网址http www data com 1 其中末尾的 1 可以一直运行到一个未预定义的数字 它返回一个数组 我需要将我得到的所有数组连接成一个 我的策略是递归执行 get 请求 直到收到 404 错误 然后返回结果 var
  • Kubernetes 上的 Spring Boot 应用程序 如何使用外部 message.properties 文件来支持 i18n 和 l10n?

    我们有一个部署到 Kubernetes 的 Spring Boot 应用程序 我们正在向此应用程序添加 i18n 功能 并希望将 messages properties 文件放置在应用程序 jar war 之外 我已经能够在春季启动中做到这
  • PowerShell 代码整洁还是重新格式化? [复制]

    这个问题在这里已经有答案了 可能的重复 有 PowerShell 代码格式化程序 漂亮的打印机吗 https stackoverflow com questions 2987176 is there a powershell code fo
  • 如何在数据框中按名称删除列

    我有一个很大的数据集 我想阅读特定的列或删除所有其他列 data lt read dta file dta 我选择我不感兴趣的列 var out lt names data names data in c iden name x serv
  • 反向填充猫鼬

    我怎样才能反向填充 mongo 我有 2 个模式 User var user scheme new mongoose Schema name String age Number roles type mongoose Schema Type
  • GNU less 的 bash 循环每 2 分钟刷新一次

    我有一台 Linux 机器 其中有一个数据文件夹和一个脚本 该脚本会生成一个报告 xlsx 电子表格文件 显示正在运行的文件夹中不断变化的内容 我使用 xlsx2tsv 脚本将其转换为 tsv 文本 耗时不到一秒 该脚本大约需要 1 分钟来
  • 使用 Typescript 和 React 三纤维的着色器

    我正在尝试将着色器与 React 三纤维和 Typescript 一起使用 着色器文件 import ShaderMaterial from three import extend from react three fiber class
  • 在类组件的方法中获取查询

    Apollo 客户端 2 6 3 与反应 是否可以在类组件的方法中获取数据 我正在构建一个全局搜索组件 并且我只想在键入第三个 以及每个后续 字符时才获取 数据 现在它是用 fetch api 实现的 但我想切换到 apollo 客户端和
  • 如何使用 gitignore 忽略非点文件(所有非隐藏目录,在我的存储库的根目录中)?

    我想跟踪我的 点文件 我想要 gitignore 来忽略所有隐藏文件 文件扩展名 本质上与以下相反 Git 如何忽略隐藏目录 https stackoverflow com questions 8021441 git how to igno
  • 如何使特定单词在文本中易于理解其含义?

    我正在为 iPhone 开发一本散文书 所以我将所有诗歌和文本存储在核心数据中 一个名为story以及名为的属性details其中包含整个轶事 但问题就在这里 如果用户想要触摸特定的单词和诗歌来了解它们的含义和定义 我应该如何处理这个任务
  • 销毁 Backbone 集合中每个模型的最简洁方法?

    第一次尝试时我写了 this collection each function element element destroy 这不起作用 因为它类似于ConcurrentModificationException在 Java 中 所有其他
  • java 1.7 中的无效标志参数

    我的任务是使用 Java 7 创建 spring boot 应用程序 因此 像往常一样 我在 start spring io 资源上创建了一个模板 并通过以下方式打开他File gt New gt Project from Existing
  • 未定义的预处理器变量“$(var.WixInstall.TargetPath)”。 WixInstaller D:work\Extractor\WixInstaller\Product.wxs

    我在使用 wix 创建 Windows 安装程序时遇到以下错误 未定义的预处理器变量 var WixInstall TargetPath WixInstaller D work Extractor WixInstaller Product
  • 在mongo中执行优先级查询

    样本文件 name John age 35 address join month 3 的员工优先级为 1 地址包含字符串 Avenue 的员工优先级为 2 地址包含字符串 Street 的员工优先级为 3 地址包含字符串 Road 的员工优
  • 与 Swingworker 的对话是先有鸡还是先有蛋

    我试图遵循 Java 最佳实践 不在主线程 EDT 上执行长时间任务 所以我计划使用带有模态对话框的 swingWorker 这样 模式对话框会阻止用户执行任何操作 直到该任务完成 并且我可以在该过程发生时更新对话框上的状态 现在的问题是
  • 清理docker环境:devicemapper

    我有一个包含 2 个容器的 docker 环境 Jenkins 和 Nexus 都有自己的命名卷 我每天都有一个 cron 作业 它会删除未使用的容器和图像 这工作正常 但问题出在我的 devicemapper 内部 du sh var l
  • MKMapView 注释更改/丢失顺序?

    我有一个带有注释的地图视图 这些注释显示标注 单击标注的公开详细信息按钮时 它会进入一个新视图 我的 MKAnnotations 是一个自定义类 它实现