geocodeAddressString导致无法识别的选择器错误处理结果

时间:2013-01-04 13:07:43

标签: iphone ios clgeocoder mkmapitem

我正在尝试使用MKMapItem创建多个地标而不使用坐标。

我在geocodeAdressString:@"Mumbai"...中直接使用了位置名称,但我得到了单个位置的结果。

虽然我通过数组使用多个位置,但我收到此错误:

  

由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:' - [__ NSArrayI length]:无法识别的选择器发送到实例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];

    }];

}

2 个答案:

答案 0 :(得分:3)

-[__NSArrayI length]: unrecognized selector sent to instance 0xab48380'的错误状态 NSArray没有属性长度。所以它无法找到长度的选择器。因此,请检查您使用NSArray的位置并保留断点以查找错误发生的位置。长度是NSStringNSData的方法,但NSArray没有长度,它有计数

答案 1 :(得分: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时,这会绕过编译器。 因此,找出出错的最佳方法是添加一个可以捕获所有异常的异常。通过选择项目导航器wind>>中的例外选项卡来完成此操作。选择'+'>> '添加异常断点...'>>然后选择完成。这将在每次应用程序抛出异常时设置断点。

编辑

感谢您添加的代码,我怀疑您传递的NSString应该是 NSArray *addr=[[NSArray alloc ]initWithObjects:@"Banglore",@"Mumbai",@"Delhi", nil]; 。你创建

geocodeAddressString:addr

然后将其传递给 [geocoder geocodeAddressString:addr completionHandler:^(NSArray *placemarks, NSError *error) {

NSString

只是从这个参数的名称我怀疑它应该是NSArray而不是[addr objectAtIndex:0]尝试将addr替换为NSString这将获得addr的索引0处的字符串对象阵列。

编辑2

以下是您正在调用的方法,它只允许为{geocodeAddressString传入 - (void)geocodeAddressString:(NSString *)addressString completionHandler:(CLGeocodeCompletionHandler)completionHandler;

{{1}}