1

我正在尝试使用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];

    }];

}
4

2 回答 2

3

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

于 2013-01-04T13:15:46.333 回答
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

这是您调用的方法,请注意它只允许NSString为 geocodeAddressString 传递一个。

  - (void)geocodeAddressString:(NSString *)addressString completionHandler:(CLGeocodeCompletionHandler)completionHandler;
于 2013-01-04T13:18:09.907 回答