はい、基本的に注釈ビューへの参照を取得し、その内容を直接更新します。
別の方法として、カスタム注釈ビュー クラスがある場合は、注釈ビューに関心のある変更を監視させ (または外部の何かに伝えさせ)、それ自体を更新させることです。
MKAnnotationView
プレーンまたはを使用している場合、最初のアプローチはより簡単ですMKPinAnnotationView
。
ビューの変更が必要であることを検出した場合は、マップ ビューのviewForAnnotation
インスタンス メソッドを呼び出して、ビューへの参照を取得します。viewForAnnotation
これは、デリゲート メソッド の呼び出しと同じではありません。
ビューへの参照を取得したら、必要に応じて変更でき、変更はすぐに表示されます。
重要な点は、デリゲート メソッドの外側でビューを更新するために使用するロジックと、デリゲート メソッド内にあるロジックがviewForAnnotation
一致している必要があるということです。これは、デリゲート メソッドが後で (ビューを手動で更新した後) マップ ビューによって呼び出される可能性があり、そのときにコードが更新されたデータを考慮に入れる必要があるためです。
これを行う最善の方法は、デリゲート メソッドと手動でビューを更新する場所の両方で呼び出される共通のメソッドに、注釈ビューの構築コードを含めることです。
注釈ビューのimage
.
カスタム アノテーション ビュー クラスを使用してビューを更新する例(ほとんどがアプローチのアイデア) については、 iPad Mapkit -ビューのピンの色を定期的に更新する「現在の場所」のタイトルを変更する (緑、紫、赤、緑、紫)を参照してください。 、赤など)。
コードが機能しない理由を説明するには、コードに不明な点が多すぎます。例えば:
- とは
data
? 注釈固有ですか(関連していan
ますか)?とはtype
? 注釈がマップに追加された後に変更されますか?
- これらのビューに表示したい基礎となるデータだけではなく、
data
ビュー オブジェクト全体をUILabel
orのように保存するのはなぜですか?UIView
imageNamed
画像がプロジェクト内のリソースである必要があります (任意の URL ではありません)。
- のタグを使用しないでください
0
(これはすべてのビューのデフォルトです)。から番号付けを開始し1
ます。
- viewWithTag を使用してビューを取得しますが、すぐに別のビューに置き換えます。
代わりに、より詳細だが単純な(r)例を示します...
MKAnnotation
これらのプロパティ (座標、タイトル、サブタイトルに加えて) を持つ注釈クラス ( を実装するクラス) があるとします。
@property (nonatomic, assign) BOOL haveImage;
@property (nonatomic, copy) NSString *labelText;
@property (nonatomic, copy) NSString *imageName;
@property (nonatomic, assign) CLLocationDistance distanceFromTarget;
上記の「重要な点」 (viewForAnnotation
デリゲート メソッドとビュー更新コードが同じロジックを使用する必要があること) に対処するために、注釈ビューを渡されるメソッドを作成し、注釈のプロパティに基づいて必要に応じて構成します。 . viewForAnnotation
このメソッドは、デリゲート メソッドと、注釈のプロパティが変更されたときにビューを手動で更新するコードの両方によって呼び出されます。
この例では、アノテーション ビューに画像が表示され、それ以外の場合haveImage
はYES
ラベルが表示されるようにしました。さらに、ラベルの背景色は以下に基づいていdistanceFromTarget
ます。
-(void)configureAnnotationView:(MKAnnotationView *)av
{
MyAnnotationClass *myAnn = (MyAnnotationClass *)av.annotation;
UILabel *labelView = (UILabel *)[av viewWithTag:1];
if (myAnn.haveImage)
{
//show image and remove label...
av.image = [UIImage imageNamed:myAnn.imageName];
[labelView removeFromSuperview];
}
else
{
//remove image and show label...
av.image = nil;
if (labelView == nil)
{
//create and add label...
labelView = [[[UILabel alloc]
initWithFrame:CGRectMake(0, 0, 50, 30)] autorelease];
labelView.tag = 1;
labelView.textColor = [UIColor whiteColor];
[av addSubview:labelView];
}
if (myAnn.distanceFromTarget > 100)
labelView.backgroundColor = [UIColor redColor];
else
labelView.backgroundColor = [UIColor greenColor];
labelView.text = myAnn.labelText;
}
}
デリゲート メソッドは次のviewForAnnotation
ようになります。
-(MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation
{
if ([annotation isKindOfClass:[MyAnnotationClass class]])
{
static NSString *myAnnId = @"myann";
MKAnnotationView *av = [mapView dequeueReusableAnnotationViewWithIdentifier:myAnnId];
if (av == nil)
{
av = [[[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:myAnnId] autorelease];
}
else
{
av.annotation = annotation;
}
[self configureAnnotationView:av];
return av;
}
return nil;
}
最後に、注釈のプロパティが変更され、注釈ビューを更新する場所のコードは次のようになります。
ann.coordinate = someNewCoordinate;
ann.distanceFromTarget = theDistanceFromTarget;
ann.labelText = someNewText;
ann.haveImage = YES or NO;
ann.imageName = someImageName;
MKAnnotationView *av = [mapView viewForAnnotation:ann];
[self configureAnnotationView:av];