更新:マイケルはそれを正しく理解しました。これが私の解決策です:
- (void) connectNextCarOnMainThread:(id)annotation{
[self performSelectorOnMainThread:@selector(connectNextCar:) withObject:annotation waitUntilDone:YES];
}
- (void) connectNextCar:(id)annotation{
Pin *pin = (Pin *)annotation;
MKMapRect zoomRect = MKMapRectNull;
MKMapPoint annotationPoint = MKMapPointForCoordinate(pin.coordinate);
MKMapRect pointRect = MKMapRectMake(annotationPoint.x, annotationPoint.y, 3, 3);
if (MKMapRectIsNull(zoomRect)) {
zoomRect = pointRect;
} else {
zoomRect = MKMapRectUnion(zoomRect, pointRect);
}
[mapView setVisibleMapRect:zoomRect animated:YES];
[mapView selectAnnotation:pin animated:YES];
NSInteger currentIndex=[self.annotations indexOfObject:annotation];
if(currentIndex < [self.annotations count]){
[self performSelector:@selector(connectNextCarOnMainThread:) withObject:[self.annotations objectAtIndex:currentIndex+1] afterDelay:5];
}
}
シンプルな機能を実現したいと思います。X秒ごとに注釈の1つを中央に配置して選択します。しかし、アノテーションの呼び出しで奇妙な動作が発生しています。
これが私のコードです:
- (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated{
if(self.movedToFitPins){
for(id <MKAnnotation> pin in self.annotations)
[self.mapView addAnnotation:pin];
self.movedToFitPins = NO;
[self performSelectorInBackground:@selector(fakeCarConnections) withObject:nil];
}
}
- (void) fakeCarConnections {
for (Pin *annotation in self.annotations)
{
[NSThread sleepForTimeInterval : 10.0];
MKMapRect zoomRect = MKMapRectNull;
MKMapPoint annotationPoint = MKMapPointForCoordinate(annotation.coordinate);
MKMapRect pointRect = MKMapRectMake(annotationPoint.x, annotationPoint.y, 3, 3);
if (MKMapRectIsNull(zoomRect)) {
zoomRect = pointRect;
} else {
zoomRect = MKMapRectUnion(zoomRect, pointRect);
}
[mapView setVisibleMapRect:zoomRect animated:YES];
[mapView selectAnnotation:annotation animated:YES];
}
}
だから、何が起こっているのかというと、私は注釈に焦点を合わせています。コールアウトバブルは開きますが、中にテキストはありません。注釈をクリックすると、テキストでコールアウトが正しく開きます。
ここに問題があります。sleepForTimeInterval行にコメントを付けると、コードは正常に機能しますが、他のすべてを通過するため、最後の注釈のみが表示されます。