1

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

    }];

}
4

2 に答える 2

3

-[__NSArrayI length]: unrecognized selector sent to instance 0xab48380' NSArray に長さのプロパティがないというエラー状態。そのため、長さのセレクターを見つけることができません。そのため、NSArray を使用している場所を確認し、ブレーク ポイントを保持して、エラーが発生している場所を見つけます。長さはNSStringandの方法ですNSDataが、NSArrayには長さはありません。カウントがあります

于 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呼び出しが可能ですが、を使用するとコンパイラーを回避します。したがって、これがどこで問題になっているのかを見つける最良の方法は、すべての例外をキャッチする例外を追加することです。これを行うには、プロジェクトナビゲータウィンドの[例外]タブを選択し、[+] >>[例外ブレークポイントを追加...]>>を選択し、[完了]を選択します。これにより、アプリが例外をスローするたびにブレークポイントが設定されます。lengthNSArrayid

編集

NSArray追加したコードのおかげで、あるべき場所を通過しているのではないかと思いますNSString。あなたが作成します

   NSArray *addr=[[NSArray alloc ]initWithObjects:@"Banglore",@"Mumbai",@"Delhi", nil];

次にそれをに渡しますgeocodeAddressString:addr

  [geocoder geocodeAddressString:addr completionHandler:^(NSArray *placemarks, NSError *error) {

このパラメータの名前から、これはである必要があり、addrをこれに置き換えようNSStringとしないでください。これにより、addr配列のインデックス0にある文字列オブジェクトが取得されます。NSArray[addr objectAtIndex:0]

編集2

これが呼び出しているメソッドですNSString。geocodeAddressStringにのみ渡すことができます。

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