ben*_*wad 44 objective-c nsarray nsset mkmapview ios
我正在尝试通过删除可见区域外的所有注释来更新MKMapView,并在可见区域内添加和删除一些注释.这是我的代码:
NSSet *visibleAnnotations = [mapView annotationsInMapRect:[mapView visibleMapRect]];
NSSet *allAnnotations = [NSSet setWithArray:[mapView annotations]];
NSMutableSet *nonVisibleAnnotations = [NSMutableSet setWithSet:allAnnotations];
[nonVisibleAnnotations minusSet:visibleAnnotations];
[mapView removeAnnotations:(NSArray *)nonVisibleAnnotations];
NSMutableSet *newAnnotations = [NSMutableSet setWithArray:[_zoomLevels objectAtIndex:clusterLevel]];
[newAnnotations minusSet:visibleAnnotations];
[mapView addAnnotations:(NSArray *)newAnnotations];
Run Code Online (Sandbox Code Playgroud)
这给了我错误- [__ NSCFSet objectAtIndex:]:在我将newAnnotations转换为NSArray的最后一行之后发送到实例0x13cd40的无法识别的选择器然后添加注释.是否有关于将数组转换为集合导致此问题的内容?如果是这样,有没有办法围绕它?
小智 176
尽管你投射NSMutableSet到NSArray,就这么简单铸造不会让NSSet类来响应NSArray的消息.你必须NSArray用这样的元素填充实际NSSet:
NSArray *array = [theNsSet allObjects];
Run Code Online (Sandbox Code Playgroud)
将NSSet对象转换为NSArray不会做任何其他欺骗编译器认为该对象是一个对象的东西NSArray.实际上,对象是一个NSSet对象,并试图将其用作NSArray会产生失败.
另一种看待它的方法是,施法只是指针上的一个技巧,而不是指向的对象,它们保持不变.
在某些情况下,转换是安全的,例如从派生类转换为基类时; 或者当您完全确定底层对象的实际类型与您将其投射到的类型一致时.
无论如何,在您的特定情况下,您可能尝试通过使用以下方法通过NSArray访问NSSet元素:
[newAnnotations allObjects]
Run Code Online (Sandbox Code Playgroud)
返回包含集合成员的数组,如果集合没有成员,则返回空数组.
从NSSet获取NSMutableArray的另一种方法是
NSMutableArray * array= [[set allObjects] mutableCopy];
Run Code Online (Sandbox Code Playgroud)
此外,satzkmr提出的解决方案为您提供了"不兼容指针"警告.(很抱歉在这里写这个,我没有足够的声誉来评论).
| 归档时间: |
|
| 查看次数: |
48552 次 |
| 最近记录: |