0

同様の問題をすべてスキャンし、考えられるすべての解決策を試しましたが、まだ私の場合の解決策を見つけることができません。MapViewに複数のピンを配置しようとしましたが、ピンを正常に追加できないようです。viewDidLoadメソッドでNSTimerを開始したので、5秒ごとに、更新されたピンがMapに配置されます。デバッグ情報を追加しましたが、問題はviewForAnnotationメソッドが呼び出されないことでした。([_map setDelegate:self]を呼び出してデリゲートを設定しました)

私のコードは次のとおりです。

    - (void)viewDidLoad
   {
        [super viewDidLoad];
        _map = [[MKMapView alloc] initWithFrame:[[self view] frame]];
        [_map setDelegate:self];

        CLLocationCoordinate2D startLocation;
        startLocation.latitude = [startLat floatValue];
        startLocation.longitude = [startLong floatValue];
        MKCoordinateSpan span = MKCoordinateSpanMake(0.002, 0.002);
        MKCoordinateRegion region = MKCoordinateRegionMake(startLocation, span);
        [_map setRegion:region];

        [[self view] addSubview:_map];

        [self getPlacesForLocation:[_map centerCoordinate]];

        NSTimer *currentTimer = [NSTimer scheduledTimerWithTimeInterval:5.0 target:self  selector:@selector(theActionMethod:) userInfo:nil repeats:YES];
        [currentTimer fire];
   }

getPlacesForLocationMethod:

-(void)getPlacesForLocation:(CLLocationCoordinate2D)location
{
     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^
                   {

                       /*  get data from the website 
                       **  get the geo information and put them in the MapPin struct
                       */

                       [self putPinsOnMap];
                   }
}

putPinsOnMap:

-(void)putPinsOnMap
{

    for(Pinfo *iter in [_PinfoArray copy])
    {
        MapPin *pin = [[MapPin alloc] init];
        [pin setTitle:[iter from_user_name]];
        [pin setSubtitle:[iter text]];
        [pin setCoordinate:[iter location]];

        //NSLog(@"The coordinate is %f  %f", [pin coordinate].latitude, [pin coordinate].longitude);

        [_map addAnnotation:pin];

        /****************************************/

        NSLog(@"Try to put the pin on Map");
        /****************************************/
    }
}

そして、これが私のMapPin.hのコンテンツです:

@interface MapPin : NSObject<MKAnnotation>

@property (nonatomic, copy) NSString *title, *subtitle;
@property (nonatomic) CLLocationCoordinate2D coordinate;

@end

その場にとどまると、(void)putPinsOnMapが呼び出されるたびに、「ピンをマップに配置してみてください」と出力されますが、viewForAnnotationメソッドは呼び出されません(デバッグ情報も追加しましたが、いずれも出力されません)。ズームアウトすると、 viewForAnnotationメソッドが呼び出されることがあります。

4

1 に答える 1

1

viewForAnnotationにデバッグ情報を追加したと言いますが、viewForAnnotationメソッドをオーバーライドするためにMKMapViewをサブクラス化していない(または、少なくとも、サブクラスではなくMKMapViewを割り当てています)。私はあなたがデリゲートメソッドを探していると思います:

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation;

また、View Controller(MKMapViewのデリゲートを作成している)にそのメソッドを実装すると、有用な情報が得られる可能性があります。

mapView:viewForAnnotation:がまだ呼び出されていない場合は、ズームアウトした場合を除いて、アノテーションが正しく配置されていない可能性があり、最初に画面に表示されていたものとは別の場所に注釈が表示されています。

于 2013-03-18T21:46:51.500 に答える