0

iOS6マップキットに関する質問がいくつかあります。現在の場所を表示し、MapViewコントロールにカスタム注釈を追加する簡単なアプリケーションを作成しようとしました。これは私のコードです:

@interface MapViewAnnotation : NSObject<MKAnnotation>{}

@property (nonatomic, copy) NSString *title;
@property (nonatomic, readonly) CLLocationCoordinate2D cordinate;

- (id) initWithTitle:(NSString *) t coordinate:(CLLocationCoordinate2D) c;

@end

そして実装:

#import "MapViewAnnotation.h"
@implementation MapViewAnnotation
@synthesize title;
@synthesize coordinate;
- (id) initWithTitle:(NSString *) t coordinate:(CLLocationCoordinate2D) c{
    self = [super init];
    self.title = t;
    self.coordinate = c;
    return self;
}
@end

そしてこれはUIViewController

#import <UIKit/UIKit.h>
#import <CoreLocation/CoreLocation.h>
#import <MapKit/MapKit.h>
@interface ViewController : UIViewController <CLLocationManagerDelegate,MKMapViewDelegate>{}

@property (nonatomic, strong) IBOutlet MKMapView *mapView;
@property (nonatomic, strong) CLLocationManager *locationManager;
@end

そして.mainファイル:

#import "ViewController.h"
#import "MapViewAnnotation.h"
@interface ViewController () @end
@implementation ViewController
@synthesize mapView, locationManager;
- (void)viewDidLoad{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    self.mapView.delegate = self;

    self.locationManager = [[CLLocationManager alloc] init];
    [locationManager setDelegate:self];

    [locationManager setDistanceFilter:kCLDistanceFilterNone];
    [locationManager setDesiredAccuracy:kCLLocationAccuracyBest];

    [self.mapView setShowsUserLocation:YES];

    CLLocationCoordinate2D location;
    location.latitude = 37.78608;
    location.longitude = -122.405398;

    MapViewAnnotation *mapAnnotation = [[MapViewAnnotation alloc] initWithTitle:@"Store location" coordinate:location];
    [self.mapView addAnnotation:mapAnnotation];
}
-(void) mapView:(MKMapView *)mapView didAddAnnotationViews:(NSArray *)views{
    MKAnnotationView *annotationView = [views objectAtIndex:0];
    id<MKAnnotation> mp = [annotationView annotation];

    MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance([mp coordinate], 250, 250);
    [self.mapView setRegion:region animated:YES];
}
@end

現在の場所は正常に表示されますが、viewDidLoadでこの行を使用すると次のようになります。

MapViewAnnotation *mapAnnotation = [[MapViewAnnotation alloc] initWithTitle:@"Store location" coordinate:location];

この例外が発生します:

MapKitDemo[3426:c07] -[MapViewAnnotation setCoordinate:]: unrecognized selector sent to instance 0x8551ae0
2012-10-03 16:19:23.070 MapKitDemo[3426:c07] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[MapViewAnnotation setCoordinate:]: unrecognized selector sent to instance 0x8551ae0'

私は何が間違っているのですか?

4

2 に答える 2

3

サブクラスのメソッドでプロパティ self.coordinate を使用しています-initWithTitle:coordinate:。これは、座標が iVar ではなくプロパティを使用して設定されていることを意味します。このプロパティは に設定されてreadonlyいるため、このエラーが発生し、おそらくクラッシュします...

次のように iVar に直接アクセスする必要があります。

#import "MapViewAnnotation.h"
@implementation MapViewAnnotation

@synthesize title = _title, coordinate = _coordinate    

- (id) initWithTitle:(NSString *) t coordinate:(CLLocationCoordinate2D) c{
    self = [super init];
    if(self){
        _title = t;
        _coordinate = c;
        // self.coordinate = c /* !This is readonly ! */
    }
    return self;
}
@end

も変更したことに注意してください@synthesize(これはもう必要ありません-これはXcode 4.5の時点で自動的に行われると思いますか?おそらく以前のバージョン)。[super init]また、init で条件を設定したことにも注意してください。これを行うと、オブジェクトの初期化に失敗した場合にプロパティ/iVar を nil に設定しようとしないようになります。

于 2012-10-03T15:29:45.920 に答える
1

座標は読み取り専用プロパティです。セッターを使用することはできません。ivar を使用するか、読み書き可能にします。

于 2012-10-03T14:37:31.887 に答える