- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我想计算用户和所有注释之间的距离。
我的注释来自一个经过解析的 csv 文件。我的注释位于 Location
类中。除了距离计算,一切正常。
为了计算距离,我找到了这段代码:
-(void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)newLocation
{
for (Location *annotation in self.mapView.annotations) {
CLLocationCoordinate2D coord = [annotation coordinate];
CLLocationCoordinate2D userCoordinate = [[[self.mapView userLocation] location] coordinate];
CLLocation *myLoc = [[CLLocation alloc] initWithLatitude:coord.latitude longitude:coord.longitude];
CLLocation *userLoc = [[CLLocation alloc] initWithLatitude:userCoordinate.latitude longitude:userCoordinate.longitude];
annotation.distance = [myLoc distanceFromLocation:userLoc];
NSLog(@"Distance is = %f", annotation.distance);
} // ! CRASH !
NSArray *sortedArray;
sortedArray = [self.mapView.annotations sortedArrayUsingComparator:^NSComparisonResult(id a, id b) {
NSNumber *first = [NSNumber numberWithDouble:[(Location*)a distance]];
NSNumber *second = [NSNumber numberWithDouble:[(Location*)b distance]];
return [first compare:second];
}];
但是我的应用程序在循环结束之前崩溃了。我发现,有断点,有一个奇怪的注释(MKUserLocation*
而不是 Location*
);在这个 MKUserLocation*
之后,应用程序崩溃了:
不正常(崩溃):
确定(没有崩溃):
为什么在我的 self.mapView.annotations
中有 MKUserLocation
?如何忽略它?
日志:
2014-09-22 06:01:47.965 MyFirstGPS2[472:60b] -[MKUserLocation setDistance:]: unrecognized selector sent to instance 0x9db0bb0
2014-09-22 06:01:48.030 MyFirstGPS2[472:60b] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[MKUserLocation setDistance:]: unrecognized selector sent to instance 0x9db0bb0'
*** First throw call stack:
(
0 CoreFoundation 0x01d971e4 __exceptionPreprocess + 180
1 libobjc.A.dylib 0x01b168e5 objc_exception_throw + 44
2 CoreFoundation 0x01e34243 -[NSObject(NSObject) doesNotRecognizeSelector:] + 275
3 CoreFoundation 0x01d8750b ___forwarding___ + 1019
4 CoreFoundation 0x01d870ee _CF_forwarding_prep_0 + 14
5 MyFirstGPS2 0x00005043 -[HPViewController mapView:didUpdateUserLocation:] + 1203
6 MapKit 0x006825e6 -[MKMapView(MKHeadingAdditions) _stopTrackingHeading] + 469
7 MapKit 0x00666a92 -[MKMapView _setUserTrackingMode:animated:fromTrackingButton:] + 301
8 MapKit 0x00666960 -[MKMapView setUserTrackingMode:animated:] + 56
9 MapKit 0x00682176 -[MKMapView(MKHeadingAdditions) disableHeadingTracking:] + 65
10 MapKit 0x00669524 -[MKMapView _didChangeRegionMidstream:] + 672
11 MapKit 0x00671fbd -[MKMapView mapLayerDidChangeVisibleRegion:] + 66
12 VectorKit 0x0407a15e -[VKMapView mapDidChangeVisibleRegion:] + 78
13 VectorKit 0x040821fe -[VKMapCanvas cameraControllerDidChangeCameraState:] + 46
14 VectorKit 0x0409f1f7 -[VKMapCameraController updatePanWithTranslation:] + 231
15 VectorKit 0x0408268f -[VKMapCanvas updatePanWithTranslation:] + 63
16 VectorKit 0x0407aca9 -[VKMapView updatePanWithTranslation:] + 73
17 MapKit 0x0069e30b -[MKMapGestureController handlePan:] + 530
18 UIKit 0x00b724f4 _UIGestureRecognizerSendActions + 230
19 UIKit 0x00b71168 -[UIGestureRecognizer _updateGestureWithEvent:buttonEvent:] + 383
20 UIKit 0x00b72bdd -[UIGestureRecognizer _delayedUpdateGesture] + 60
21 UIKit 0x00b7613d ___UIGestureRecognizerUpdate_block_invoke + 57
22 UIKit 0x00b760be _UIGestureRecognizerRemoveObjectsFromArrayAndApplyBlocks + 317
23 UIKit 0x00b6c7ac _UIGestureRecognizerUpdate + 199
24 UIKit 0x00817a5a -[UIWindow _sendGesturesForEvent:] + 1291
25 UIKit 0x00818971 -[UIWindow sendEvent:] + 1021
26 UIKit 0x007ea5f2 -[UIApplication sendEvent:] + 242
27 UIKit 0x007d4353 _UIApplicationHandleEventQueue + 11455
28 CoreFoundation 0x01d2077f __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 15
29 CoreFoundation 0x01d2010b __CFRunLoopDoSources0 + 235
30 CoreFoundation 0x01d3d1ae __CFRunLoopRun + 910
31 CoreFoundation 0x01d3c9d3 CFRunLoopRunSpecific + 467
32 CoreFoundation 0x01d3c7eb CFRunLoopRunInMode + 123
33 GraphicsServices 0x03acf5ee GSEventRunModal + 192
34 GraphicsServices 0x03acf42b GSEventRun + 104
35 UIKit 0x007d6f9b UIApplicationMain + 1225
36 MyFirstGPS2 0x00013592 main + 130
37 libdyld.dylib 0x0258a701 start + 1
38 ??? 0x00000001 0x0 + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException
(lldb)
注意:我正在使用此页面中的代码来解析 csv 文件,我认为这不是问题所在:http://blog.smartfrog.fr/post/32123941502/tutorial-ios-mapkit
最佳答案
MKUserLocation
不是一个“奇怪”的注解。
当您将 showsUserLocation
设置为 YES
时,它是 map View 添加的用户位置(蓝点)注释的文档类。
map View 的annotations
数组包括添加到 map 的所有 注释——无论是由您还是由 map View 添加(另请注意,这些注释不会以任何特定顺序).
为确保您只处理 Location
类型的注释,您可以在使用 isKindOfClass
方法处理之前检查注释对象的类。
如果注释不属于该类,则跳过它(继续
循环)。
排序数组的代码会遇到类似的问题,因为它会尝试访问 MKUserLocation
注释上的 distance
属性。
与其尝试从 map View 的 annotations
数组创建排序数组,我建议在 for 循环(在同时设置 distance
) 然后对该数组进行排序。
在 for 循环和排序更改中使用 isKindOfClass
的示例:
-(void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)newLocation
{
if (newLocation == nil) {
//can happen if still waiting for user permission
return;
}
if (!CLLocationCoordinate2DIsValid(newLocation.coordinate)) {
//can happen if just resumed from some time in the background
return;
}
//Declare and set user location variables outside the for-loop
//since they won't be changing during the loop...
CLLocationCoordinate2D userCoordinate = [[[self.mapView userLocation] location] coordinate];
CLLocation *userLoc = [[CLLocation alloc] initWithLatitude:userCoordinate.latitude longitude:userCoordinate.longitude];
//declare array in which you will put your Location annotations for sorting later...
NSMutableArray *locAnnArray = [NSMutableArray array];
//Declare the loop variable as a generic id<MKAnnotation>
for (id<MKAnnotation> annotation in self.mapView.annotations) {
//Before processing the annotation, check it it's of type Location...
if (! [annotation isKindOfClass:[Location class]]) {
continue;
}
//Cast annotation to Location so we can see the distance property...
Location *locAnn = (Location *)annotation;
CLLocationCoordinate2D coord = [locAnn coordinate];
CLLocation *myLoc = [[CLLocation alloc] initWithLatitude:coord.latitude longitude:coord.longitude];
locAnn.distance = [myLoc distanceFromLocation:userLoc];
NSLog(@"Distance is = %f", locAnn.distance);
//Add Location annotation to local array for later sorting...
[locAnnArray addObject:locAnn];
}
//Sort our array of Location annotations...
[locAnnArray sortUsingComparator:^NSComparisonResult(id a, id b) {
NSNumber *first = [NSNumber numberWithDouble:[(Location*)a distance]];
NSNumber *second = [NSNumber numberWithDouble:[(Location*)b distance]];
return [first compare:second];
}];
//do something with the sorted array...
//...
}
关于ios - 为什么我的注释中有 MKUserLocation?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25975951/
我想计算用户和所有注释之间的距离。 我的注释来自一个经过解析的 csv 文件。我的注释位于 Location 类中。除了距离计算,一切正常。 为了计算距离,我找到了这段代码: -(void)mapVi
可以使用 MKUserLocation 将标题和副标题添加到 iOS 显示的用户位置.当用户点击该位置时,这些将显示在该位置上方的气泡中。可以通过从 MKAnnotationView 选择带有 set
我为用户位置创建了一个自定义 MKAnnotationView: - (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotatio
我想在 MKMapView 显示后立即以编程方式选择当前用户位置的 MKUserLocation。 我已经尝试过这样做: func mapView(mapView: MKMapView, didAdd
我希望在 MKMapView 上创建一个“长按”针落点。 目前,一切都按照我想要的方式进行,当您点击并按住 map 时,它会注册手势并且代码会放置一个图钉。 -(void)viewDidLoad {
我正在尝试为 map 上的注释创建自定义注释 View 。我通过调整协议(protocol) MKMapViewDelegate 并覆盖函数 mapView:viewForAnnotation: 来做
我有一个导航 Controller ,其中 VC1 将 VC2 推送到导航堆栈。 VC2 在基于选项卡的 View 中有一个 MKMapView,并打开了用户位置。当我使用 Heapshot 分析工具
iOS 10 中的 map 应用现在在 MKUserLocation MKAnnotationView 顶部包含一个前进方向箭头。有什么方法可以将它添加到我自己的应用程序中的 MKMapView 吗?
我有一个 MKMap 和一系列 MKAnnotations,所有这些都是红色的,这很好。我在 IB 中选择了“显示用户位置”并将 MKAnnotation 从红色更改为蓝色,我的 viewForAnn
我有一个 MapView 显示一些带有 displayPriority = .defaultHight 的注释以允许自动聚类。 MapView 还显示当前用户位置,默认显示优先级为required。
我正在使用 MKMapView,并且已启用对当前位置的跟踪。 mapView.showsUserLocation = true mapView.setUserTrackingMode(.FollowW
我通过子类化 MKAnnotationView 创建了一个自定义注释 View 。此类还创建了一个自定义标注(信息弹出“气泡”) View ,其外观与我的应用相匹配。 我还希望能够为用户位置点重新设置
我的 iOS 应用程序中有一张法线 map ,其中启用了“显示用户位置”——这意味着我在 map 上有我的法线蓝点,显示我的位置和精度信息。标注在代码中被禁用。 但我也有自定义的 MKAnnotati
我需要一种将 MKUserLocation 转换为 CLLocation 的方法,以便我可以在 swift 中使用 distanceFromLocation 方法找到用户位置与另一个预定义 CLLoc
我的应用程序中有一个显示用户位置的 map View 。当点击用户的位置时,图像显示如下: 有没有办法根据我的喜好定制这张图片,例如我想显示用户在他自己的个人资料中的照片,或者我想添加的任何其他静态图
我的应用程序中有一个MapView。 Showuserlocation已激活。 我添加了GestureRecognizer以便长按。 一切正常。 通过缺点,当我触摸用户的注释(蓝色圆圈)时,手势事件未
我最近将我的 map 从 Mapkit 切换到了 Google map 。但是我正在尝试将用户位置坐标更新为 firebase。相当于 MKUserLocation 的 google 是什么 func
mapView:viewForAnnotation: 方法有一个名为 annotation (MKUserLocation) 的参数。在我的应用程序中,我想将此 annotation 类型转换为 MK
我有一个名为 Device 的自定义类,它实现了 MKAnnotation 协议(protocol)。在我关注的示例中(来自 O'Reilly Media 的 iPad 上的 MapKit 和核心位置
我想将 MKAnnotationView 图钉放在 map 上,并让图钉像 MKUserLocation 动画一样动画(带有圆形波浪的蓝点出现) 如何实现这种类型的动画?我需要采取哪些步骤? 谢谢!
我是一名优秀的程序员,十分优秀!