0

ハイ・ガイズ!

私のMySQLには約3〜4kの注釈があり、非同期リクエストを介してそれらを受け取ります...注釈を表示するだけで問題ありませんが、ユーザーが強調表示された注釈を選択してDetailViewに移動できるようにしたい(まだ実装されていません。テスト用のみ)...

注釈を表示するだけで問題ありません。数秒しかかかりません (「viewForAnnotation」メソッドを使用しない場合) ... しかし、このメソッドを使用すると、すべての注釈が表示され、「showDetails」ボタンを使用できるようになるまでに約 1 分かかります。 .

または: 私のコードは間違っていますか (私は Xcode で完全に新しいです)...私のコードはすべての注釈に対して完全に新しいビューを作成するように見えますよね?

私のコードが完全でナンセンスな場合は、それを教えてください。最初からやり直す必要がありますが、コードを使用して何かを変更できるかもしれません。:-)

thx 4 ヘルプ ゲルハルト

MapViewController.h

#import<UIKit/UIKit.h>
#import<MapKit/MapKit.h>

@interface MapViewController : UIViewController <MKMapViewDelegate>
/*{
   IBOutlet MKMapView* mapView;
}*/
@property (strong, nonatomic) IBOutlet MKMapView *mapView;
@property (strong, nonatomic) IBOutlet UIView *loadingView;
@property (nonatomic, strong) NSMutableArray *pois;
@end

MapViewController.m

#import "MapViewController.h"

@interface MapViewController ()
@end

@implementation MapViewController

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;    
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    [[self navigationController] setNavigationBarHidden:NO animated:NO];

    _mapView.delegate = self;
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
}


- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    [self loadPoiData];
    [self zoomToUserLocation:self.mapView.userLocation];
}

- (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation
{
    [self zoomToUserLocation:self.mapView.userLocation];
}

- (void)zoomToUserLocation:(MKUserLocation *)userLocation
{
    if (!userLocation)
        return;

    MKCoordinateRegion region;
    region.center = userLocation.location.coordinate;
    region.span = MKCoordinateSpanMake(0.2, 0.2);
    region = [self.mapView regionThatFits:region];
    [self.mapView setRegion:region animated:YES];   
}

- (void)loadPoiData
{
    CLLocationCoordinate2D location;

    NSURL *url = [NSURL URLWithString:@"http://myURL/AppFiles/poidrive.php"];
    NSData *jsonData = [NSData dataWithContentsOfURL:url];
    if(jsonData != nil)
    {
        NSError *error = nil;
        _pois = [NSJSONSerialization JSONObjectWithData:jsonData     options:NSJSONReadingMutableContainers error:&error];
    }

    _loadingView.hidden = YES;

    for (NSDictionary *annotations in _pois)
    {
        location.latitude = [annotations[@"POI_LAT"] doubleValue];
        location.longitude = [annotations[@"POI_LONG"] doubleValue];

        CLLocationCoordinate2D coords = CLLocationCoordinate2DMake(location.latitude, location.longitude);

        MKPointAnnotation *point = [MKPointAnnotation new];

        point.coordinate = coords;
        point.title = [annotations objectForKey:@"POI_NAME"];
        point.subtitle = [annotations objectForKey:@"POI_ID"];

        [self.mapView addAnnotation:point];
    }
}

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation
{
// if it's the user location, just return nil.
    if ([annotation isKindOfClass:[MKUserLocation class]])
        return nil;

// try to dequeue an existing pin view first
static NSString* AnnotationIdentifier = @"AnnotationIdentifier";
MKPinAnnotationView* pinView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:AnnotationIdentifier] ;
pinView.animatesDrop=YES;
pinView.canShowCallout=YES;
NSLog(@"test");

UIButton* rightButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
[rightButton setTitle:annotation.title forState:UIControlStateNormal];
[rightButton addTarget:self action:@selector(showDetails:) forControlEvents:UIControlEventTouchUpInside];
pinView.rightCalloutAccessoryView = rightButton;

//UIImageView *profileIconView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"profile.png"]];
//pinView.leftCalloutAccessoryView = profileIconView;

return pinView;
}

-(IBAction)showDetails:(id)sender
{
NSLog(@"%@",((UIButton*)sender).currentTitle);
}

@end
4

1 に答える 1

0

への呼び出しごとに新しいビューを作成しているのは正しいですviewForAnnotation注釈ビューの再利用、特にデキューについては、Apple ドキュメントをご覧ください。

于 2013-04-29T01:00:01.430 に答える