来自 geocodeAddressString 的无法识别的选择器错误处理结果
Posted
技术标签:
【中文标题】来自 geocodeAddressString 的无法识别的选择器错误处理结果【英文标题】:Unrecognized selector error processing results from geocodeAddressString 【发布时间】:2013-01-04 13:07:43 【问题描述】:我正在尝试使用 MKMapItem
创建多个地标而不使用坐标。
我直接在geocodeAdressString:@"Mumbai"...
中使用了位置名称,但我得到了单个位置的结果。
虽然我通过数组使用多个位置,但出现此错误:
由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“-[__NSArrayI 长度]:无法识别的选择器发送到实例 0xab48380”
为什么会出现这个问题?
Class mapItemClass=[MKMapItem class];
if(mapItemClass &&[mapItemClass respondsToSelector:@selector(openMapsWithItems:launchOptions:)])
NSArray *addr=[[NSArray alloc ]initWithObjects:@"Banglore",@"Mumbai",@"Delhi", nil];
CLGeocoder *geocoder=[[CLGeocoder alloc]init];
[geocoder geocodeAddressString:addr completionHandler:^(NSArray *placemarks, NSError *error)
CLPlacemark *geocodedPlacemark=[placemarks objectAtIndex:0];
MKPlacemark *placemark=[[MKPlacemark alloc]initWithCoordinate:geocodedPlacemark.location.coordinate addressDictionary:geocodedPlacemark.addressDictionary];
MKMapItem *mapItem=[[MKMapItem alloc]initWithPlacemark:placemark];
[mapItem setName:geocodedPlacemark.name];
[MKMapItem openMapsWithItems:@[mapItem] launchOptions:nil];
];
【问题讨论】:
您在NSArray
、NSArray
上的通话长度没有他们计算的长度。
添加异常断点以确定代码中的哪一行最终发出此调用
请贴出相关代码
可以任何1指导我我犯了什么错误..提前谢谢..
【参考方案1】:
-[__NSArrayI length]: unrecognized selector sent to instance 0xab48380'
的错误状态
NSArray 没有属性长度。所以找不到长度的选择器。因此,请检查您在哪里使用 NSArray 并保留断点以查找发生错误的位置。 length 是 NSString
和 NSData
的方法,但是 NSArray 没有长度,它有计数
【讨论】:
【参考方案2】:我已经能够使用此代码复制它
id array = [[NSArray alloc] initWithObjects:@"Hello", @"World", nil];
NSLog(@"%d",[array length]);
输出
-[__NSArrayI length]: unrecognized selector sent to instance 0x96bafe0
注意我是如何使用id
而不是NSArray
来使用id
我可以调用length
,这是NSArray
所不允许的,但是在使用id
时这会绕过编译器.
所以找出哪里出错的最好方法是添加一个异常来捕获所有异常。通过在项目导航器中选择异常选项卡来执行此操作风>>选择'+'>>'添加异常断点...'>>然后只需选择完成。这将在您的应用每次抛出异常时设置一个断点。
编辑
感谢您添加的代码,我怀疑您传递了一个 NSArray
,其中应该有一个 NSString
。你创造
NSArray *addr=[[NSArray alloc ]initWithObjects:@"Banglore",@"Mumbai",@"Delhi", nil];
然后将其传递给geocodeAddressString:addr
[geocoder geocodeAddressString:addr completionHandler:^(NSArray *placemarks, NSError *error)
仅从这个参数的名称来看,我怀疑它应该是 NSString
而不是 NSArray
尝试将 addr 替换为 [addr objectAtIndex:0]
这将在 addr 数组的索引 0 处获得字符串对象。
编辑 2
这是您调用的方法,请注意它只允许为 geocodeAddressString 传入 NSString
。
- (void)geocodeAddressString:(NSString *)addressString completionHandler:(CLGeocodeCompletionHandler)completionHandler;
【讨论】:
[geocoder geocodeAddressString:addr completionHandler:^(NSArray *placemarks, NSError *error)
这一行你传递的是 geocodeAddressString 和 NSArray
你应该传递的是 NSString
是否可以通过 NSString 传递 2 或 3 个位置?
我想你会发现你只能传入NSString
而不能传入NSArray
谢谢大力水手..它工作正常没有错误..但是使用索引值:0..它只是单独显示第一个位置..Banglore..
是否有可能通过更改该索引值来显示所有 3 个位置??以上是关于来自 geocodeAddressString 的无法识别的选择器错误处理结果的主要内容,如果未能解决你的问题,请参考以下文章
为啥 .geocodeAddressString 不会更改外部变量?
网点更名?破坏 geocodeAddressString()?
geocoder.geocodeAddressString 今天不再适用于快速更新