1

編集された質問:

マップビュー(タイトル/サブタイトル付き)で作成された注釈を取得し、マップ上のすべての注釈をタイトル/サブタイトル付きのリストを表示するテーブルビューにプッシュしようとしています。

MapViewControllerのピンに入力する必要がある逆ジオコーディングを機能させるRegionAnnotation.h/.mNSObjectファイルがあります。これは問題なく機能します。ピンを作成する長押しを行うと、タイトルとサブタイトルが表示され、逆ジオコーディングが機能します。

次に、ピンデータをテーブルビューリストにプッシュします。内の領域注釈情報を呼び出してみましたが、セルの正しい形式を取得してタイトルとサブタイトルを入力するためcellForRowAtIndexPathに使用しています。UITableViewCellStyleSubtitleしかし、私が次のように呼ぶとき:

if (cell == nil){
    NSLog(@"if cell");
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
        }

CLPlacemark *pins = [self.annotations objectAtIndex:indexPath.row];
RegionAnnotation *annotation = [[RegionAnnotation alloc] initWithLocationIdentifier:(NSString *)pins];
cell.textLabel.text = annotation.title;

タイトルだけが表示されます。この場合は「ロケーションリマインダー」ですが、アドレスであるサブタイトル情報がテーブルに表示されません。表示されるのは「字幕」というテキストだけです。

タイトルとサブタイル情報の両方をセルに入力するにはどうすればよいですか。私はこれに1か月以上取り組んできましたが、解決策が見つからないようです。助けてください。

4

1 に答える 1

0

投稿された最新のコードに関するいくつかのコメント:

CLPlacemark *pins = [self.annotations objectAtIndex:indexPath.row];
RegionAnnotation *annotation = [[RegionAnnotation alloc] 
    initWithLocationIdentifier:(NSString *)pins];

これは正しく見えません。pins変数は(に準拠していないため、それ自体が疑わしいので、なぜ「アノテーション」配列にあるのですか?)として宣言され、とCLPlacemarkは関係のないキャストされます。キャストは文字列に変換されません。つまり、が指すデータを(そうではない)ものとして処理します。CLPlacemarkMKAnnotationNSString *CLPlacemarkpinspinsNSString

同様に投稿された以前のコードには、他にも多くの問題、質問、不明な点があります。


代わりに、マップビューにある注釈をテーブルビューに渡し、セルにデータを表示する方法の例を示します...

  • (テーブルビューのあるもの)では、アノテーションを受け取って参照PinListViewControllerするプロパティを宣言します。NSArray

    //in the .h:
    //Don't bother declaring an ivar with the same name.
    @property (nonatomic, retain) NSArray *annotations;
    //in the .m:
    @synthesize annotations;
    
  • 次に、で、MapViewControllerを提示/プッシュ/表示したい場所でPinListViewController、コードは次のようになります。

    PinListViewController *plvc = [[PinListViewController alloc] init...
    
    //pass the map view's annotations array...
    plvc.annotations = mapView.annotations;
    
    [self presentModalViewController:plvc animated:YES];  //or push, etc.
    
    [plvc release];  //remove if using ARC
    

    ここで重要な点は、この例では注釈配列全体を送信することです。を使用してユーザーの現在の場所を表示している場合showsUserLocation = YES、配列にはその注釈も含まれます。特定の注釈のみを送信する場合は、最初に、マップビュー配列から必要な注釈を含む新しい配列を作成し、plvc.annotationsその新しい配列と等しく設定する必要があります。これを行う簡単な方法は、をループするmapView.annotationsことです。注釈を含める場合は、を使用して新しい配列に追加しaddObjectます。マップビューのannotations配列を直接使用する場合に考えられるもう1つの問題は、マップ上の注釈が変更(追加/削除)された場合ですテーブルビューにはまだ注釈リストが表示されていますが、同期がとれなくなり、実行時範囲の例外が発生する可能性があります。これを回避するには、必要に応じてplvc.annotations、マップビューの注釈配列のコピーを設定できます(つまり、[mapView.annotations copy])。

  • PinListViewControllernumberOfRowsInSectionメソッドで:

    return self.annotations.count;
    
  • PinListViewControllercellForRowAtIndexPathメソッドで:

    //typical dequeue/alloc+init stuff here...
    //assume cell style is set to UITableViewCellStyleSubtitle
    
    id<MKAnnotation> annotation = [self.annotations objectAtIndex:indexPath.row];
    cell.textLabel.text = annotation.title;
    cell.detailTextLabel.text = annotation.subtitle;
    
    return cell;
    

    この例では標準とプロパティのみを表示する必要があるため、は任意のタイプのアノテーションで機能するようにannotation宣言されています。カスタムアノテーションクラスにある可能性のあるカスタムプロパティを表示する必要がある場合は、を使用してそのタイプであるかどうかを確認し、それをそのカスタムクラスにキャストして、カスタムプロパティを参照できます。id<MKAnnotation>titlesubtitleisKindOfClassannotation

于 2012-09-15T13:13:45.650 に答える