来自 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];

    ];


【问题讨论】:

您在NSArrayNSArray 上的通话长度没有他们计算的长度。 添加异常断点以确定代码中的哪一行最终发出此调用 请贴出相关代码 可以任何1指导我我犯了什么错误..提前谢谢.. 【参考方案1】:

-[__NSArrayI length]: unrecognized selector sent to instance 0xab48380' 的错误状态 NSArray 没有属性长度。所以找不到长度的选择器。因此,请检查您在哪里使用 NSArray 并保留断点以查找发生错误的位置。 length 是 NSStringNSData 的方法,但是 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()?

geocodeAddressString 不能快速工作

geocoder.geocodeAddressString 今天不再适用于快速更新

如何从 CLGeocoder geocodeAddressString() 中的完成处理程序更新列表中的地址

按最近位置排序 CLGeoCoder geocodeAddressString 的结果