1

追加された最後の注釈を削除するボタンを .xib ファイルに追加しました。

したがって、タッチダウンアクションでは、これを実装しました:

-(IBAction)DeleteAnnotation:(id)sender {
   [mapview removeAnnotation:[mapview.annotations lastObject]];
}

そして、私はこの方法でそれを試しました:

-(IBAction)DeleteAnnotation:(id)sender {
   [self.mapview removeAnnotation:self.mapview.annotations.lastObject]];
}

mapview私のMKMapViewアウトレットはどこですか.

両方の方法で発生する問題は、注釈を削除する前に、この特定のボタンを何度も押さなければならないことです。

さらに、注釈は非常にランダムな方法で削除されます。

私が間違っていることはありますか、それともソフトウェアとシミュレーターの問題ですか?

4

1 に答える 1

3

annotationsプロパティはMKMapView、追加した順序と同じ順序で注釈を返すことは保証されていません。

配列プロパティが、注釈を追加したのと同じ順序で注釈を返すという仮定を立てることが、annotationsあなたが目にする「奇妙な」動作の理由である可能性が最も高いです。詳細については、これらの関連する回答を参照してください。


必要な動作を取得するには (単に「コードによって明示的に追加された最後の注釈を削除する」と仮定します)、3 つの可能なアプローチを次に示します (他にもある可能性があります)。

  1. 最も簡単な方法は、最後に追加した注釈への参照を強力なプロパティに保持することです ( を呼び出すときに参照を更新しますaddAnnotation)。「最後に追加された注釈」を削除する場合は、その保存された参照を に渡しremoveAnnotationます。例えば:

    //in the interface...
    @property (nonatomic, strong) id<MKAnnotation> lastAnnotationAdded;
    
    //in the implementation...
    
    //when you add an annotation:
    [mapview addAnnotation:someAnnotation];
    self.lastAnnotationAdded = someAnnotation;  //save the reference
    
    //when you want to remove the "last annotation added":
    if (self.lastAnnotationAdded != nil)
    {
        [mapview removeAnnotation:self.lastAnnotationAdded];
        self.lastAnnotationAdded = nil;
    }
    
  2. もう 1 つのオプションは、マップ ビューのannotations配列をループして、「最後の」注釈 (または関心のある任意の属性) を検索することです。「最後の」オブジェクト (必ずしも配列内の最後のオブジェクトであるとは限りません) への参照を取得したら、それを呼び出すことができますremoveAnnotation。このアプローチは、注釈オブジェクト自体に、注釈を「最後の」注釈として識別できるプロパティがあることを前提としています。これは常に可能であるとは限りません。

  3. もう 1 つのオプションは、注釈の独自の配列を保持し、 を呼び出すたびにこの配列に注釈オブジェクトを追加することですaddAnnotation。これは、信頼できる順序でリスト全体を追跡することを除いて、「最後に追加された注釈」のみへの単一の参照を保持することに似ています。「最後の」ものを削除するlastObjectには、マップビューの代わりに配列から取得します(配列をその順序で保持していると仮定します)。マップに注釈を追加/削除するときは、配列を同期させておく必要があります。

于 2013-07-27T14:11:38.920 に答える