2016-04-30 11 views
0

私はユーザーが変更可能な配列のお気に入りとしてアノテーションを保存できるマップアプリケーションを持っています。ユーザーが選択すると、すべてのお気に入りの注釈が表示されます。変更可能な配列からMKPointAnnotationオブジェクトを削除する

変更可能な配列に追加される注釈は、MKPointAnnotationクラスです。変更可能な配列にアノテーションを正しく追加することはできますが、変更可能な配列から特定のアノテーションを正しく削除するワーキング・ソリューションはありません。どのように特定の注釈を、お気に入りとして保存された複数の注釈を含む変更可能な配列から削除できますか?私のサンプルコードには、いくつかの機能しない解決策があります。

//** Correctly adds a favorite annotation to the mutable array favoriteAnnotationsArray ** 
-(void)addToFavoriteAnnotationsArray{ 
    MKPointAnnotation *annotation = [[MKPointAnnotation alloc] init]; 
    NSArray *components = [favoritesString componentsSeparatedByString:@","]; 
    annotation.coordinate = CLLocationCoordinate2DMake([components[1] doubleValue], [components[0] doubleValue]); 
    annotation.title = [components[2] stringByTrimmingCharactersInSet:NSCharacterSet.whitespaceAndNewlineCharacterSet]; 

    [self.favoriteAnnotationsArray addObject:annotation]; 

} 
//** Need to remove a favorite annotation from the mutable array favoriteAnnotationsArray ** 
-(void)removeObjectFromFavoriteAnnotationsArray{ 

    MKPointAnnotation *annotation = [[MKPointAnnotation alloc] init]; 
    NSArray *components = [favoritesString componentsSeparatedByString:@","]; 
    annotation.coordinate = CLLocationCoordinate2DMake([components[1] doubleValue], [components[0] doubleValue]); 
    annotation.title = [components[2] stringByTrimmingCharactersInSet:NSCharacterSet.whitespaceAndNewlineCharacterSet]; 

    //** Used in first non-working solution below ** 
    //NSMutableArray *objectToRemoveArray = [[NSMutableArray alloc] init]; 
    //[objectToRemoveArray addObject:annotation]; 

    //** The following three lines didn't remove any annotations from array ** 
    //[self.favoriteAnnotationsArray removeObjectsInArray:objectToRemoveArray]; 
    //[self.favoriteAnnotationsArray removeObject:annotation]; 
    //[self.favoriteAnnotationsArray removeObjectIdenticalTo:annotation]; 

    //** This only removes the last object in array and not necessarily the correct annotation to remove ** 
    [self.favoriteAnnotationsArray removeLastObject]; 

} 

答えて

0

アノテーション配列を繰り返して削除する方法があります。たとえば、次のように

- (void)addToFavoriteAnnotationsArray:(NSString *)string { 
    MKPointAnnotation *annotation = [[MKPointAnnotation alloc] init]; 
    NSArray *components = [string componentsSeparatedByString:@","]; 
    annotation.coordinate = CLLocationCoordinate2DMake([components[1] doubleValue], [components[0] doubleValue]); 
    annotation.title = [components[2] stringByTrimmingCharactersInSet:NSCharacterSet.whitespaceAndNewlineCharacterSet]; 

    [self.favoriteAnnotationsArray addObject:annotation]; 
} 

- (void)removeObjectFromFavoriteAnnotationsArray:(NSString *)string { 
    NSArray *components = [string componentsSeparatedByString:@","]; 
    NSString *titleOfAnnotationToRemove = [components[2] stringByTrimmingCharactersInSet:NSCharacterSet.whitespaceAndNewlineCharacterSet]; 
    CLLocationCoordinate2D coordinateOfAnnotationToRemove = CLLocationCoordinate2DMake([components[1] doubleValue], [components[0] doubleValue]); 

    for (NSInteger i = 0; i < self.favoriteAnnotationsArray.count; i++) { 
     id<MKAnnotation>annotation = self.favoriteAnnotationsArray[i]; 
     if ([annotation.title isEqualToString:titleOfAnnotationToRemove] && coordinateOfAnnotationToRemove.latitude == annotation.coordinate.latitude && coordinateOfAnnotationToRemove.longitude == annotation.coordinate.longitude) { 
      [self.favoriteAnnotationsArray removeObjectAtIndex:i]; 
      break; 
     } 
    } 
} 

それともあなただけでは、タイトルに一致したい場合は、上記ifのステートメントから座標を削除します。また、これらのメソッドにパラメータとして文字列を追加しました。いくつかのプロパティに頼るのではなく、メソッドにパラメータを渡す方が常に良いです。

しかし、ユーザーが削除するものを選択しているときは、手動で名前と座標を手動で入力する必要はありません。あなたはおそらく彼らがリストから1つを選ぶことを望んでいるでしょう。だから、彼らに注釈のテーブルビューを表示することがありますし、彼らは三番目を削除したいと言うとき、あなたはちょうどこのようなメソッドにインデックスを渡すんだろう:

- (void)removeObjectFromFavoriteAnnotationsArray:(NSInteger)index { 
    [self.favoriteAnnotationsArray removeObjectAtIndex:index]; 
} 

ところで、のすべてを上記のルーチンは配列から注釈を削除します。このアノテーションをマップビューに追加した場合は、そのアノテーションもそこから削除してください。

+0

解決策Robに感謝します。私の注釈のタイトルはすべてユニークなので、条件文を簡略化して注釈のタイトルのみをチェックし、座標はチェックしません。ところで、私はisEqualToStringに条件式の==を変更しなければなりませんでした。再度、ソリューションに感謝します。 – Cheesehead1957

+0

Lol。私は最近スウィフトコードをあまりにも多く書いています... – Rob

+0

@ Cheesehead1957 - ところで、あなたはたくさんの質問をしてきましたが、答えを受け入れていないようです。 「私の質問に答えたとき、私は何をすべきですか?」(http://stackoverflow.com/help/someone-answers)私があなたの答えを受け入れるかどうかは気にしませんが、おそらくそのうちの1つを受け入れるべきです。おそらくあなたの質問履歴に戻って、あなたが受け入れるべき他の質問に対する他の答えがあるかどうかを調べるべきでしょう。 – Rob

0

正常に削除されるためには、favoriteAnnotationsArrayから一意の注釈を指定する必要があります。次のように

たぶん、あなたが何かを試すことができます。

-(void)removeAnnotationFromFavoriteAnnotationsArrayWithTitle: (NSString *) titleString { 
    for(int i=0; i<self.favoriteAnnotationsArray.count; i++) { 
     MKPointAnnotation *annotation = (MKPointAnnotation *)[self.favoriteAnnotationsArray objectAtIndex:i]; 
     NSString * annotationTitle = annotation.title; 
     if([annotationTitle isEqualToString:titleString]) { 
      [self.favoriteAnnotationsArray removeObject:annotation]; 
      break; 
     } 
    } 
} 

をタイトルが十分に一意でない場合は、注釈を区別するために、あなたはMKAnnotationをサブクラス化することを検討し、独自のプロパティを追加し、上記の関数に渡すかもしれませんタイトルの代わりに。

関連する問題