1

MapKit を使用して、1 つ以上の MKMapItem オブジェクトを返すローカル検索を実行しています。しかし、デバッガーで表示できるオブジェクトのメンバーがありますが、アクセスできません。特に必要なのは UID です。

item.placemark を試しましたが、UID にアクセスできません。これは本当に単純なはずです。ここで何が欠けていますか?

これは機能しません: NSString *uid = item.placemark.UID

これは動作しません:

NSDictionary *mapItemDictionary = (NSDictionary *)item;
NSString *uid = [mapItemDictionary objectForKey:@"UID"];

しかし、デバッガー コマンドの po item には、オブジェクトのすべてのメンバーが表示されます。

Name: Shell CurrentLocation: 0 Place: <GEOPlace: 0x17014e650> 
{
address =     {

business =     (
            {
        **UID = 2478578482074921045**;
        URL = "www.shell.com";
        canBeCorrectedByBusinessOwner = 1;
        name = Shell;
        source =             (
                            {
                "source_id" = A3H0281540;
                "source_name" = "acxiom_us";
            },
                            {
                "source_id" = 2276257;
                "source_name" = localeze;
            }
        );
        telephone = "+14803968213";
    }
);

これについての助けをいただければ幸いです。私が使用しているコードは次のとおりです。

MKLocalSearch *localSearch = [[MKLocalSearch alloc] initWithRequest:request];
[localSearch startWithCompletionHandler:^(MKLocalSearchResponse *response, NSError *error)
 {

      [response.mapItems enumerateObjectsUsingBlock:^(MKMapItem *item, NSUInteger idx, BOOL *stop)
      {

          MKPlacemark *placemark = (MKPlacemark *)item.placemark;
          NSDictionary *addressDict = placemark.addressDictionary;
          NSArray *businessArray = addressDict[@"business"];// businessArray is NIL

          NSString *uid=nil;

          if (businessArray != nil && businessArray.count >0) {
              NSDictionary *businessDict=businessArray[0];
              uid=businessDict[@"UID"];
          }

          NSLog(@"UID is %@",uid);

 }];
4

1 に答える 1

1

わかりましたので、掘り下げた後、情報はいくつかのプライベート オブジェクトにあるようです。「場所」プロパティは GEOPlace であり、これには GEOBusiness オブジェクトを含む配列であるビジネス プロパティがあります。これは非公開データであるため、プロパティを介して直接アクセスすることはできませんが、キーと値のエンコーディングを介して取得できます。次のコードは UID を抽出します -

[response.mapItems enumerateObjectsUsingBlock:^(MKMapItem *item, NSUInteger idx, BOOL *stop) {

    NSValue *place = [item valueForKey:@"place"];
    NSArray *businessArray = (NSArray *)[place valueForKey:@"business"];

    NSNumber *uid=nil;

    if (businessArray != nil && businessArray.count >0) {
         id geobusiness=businessArray[0];
         uid=[geobusiness valueForKey:@"uID"];
    }

    NSLog(@"UID is %@",[uid stringValue]);

 }];

これはプライベートなデータ構造であるため、変更されないという保証はありません。また、アプリストアの検証プロセスがこれをプライベート api アクセスとしてフラグ付けするかどうかもわかりません。使用しているためvalueForKey、そうなるとは思いませんが、保証はありません。

于 2014-06-19T09:49:03.387 に答える