1

追加情報を保持できるようにカスタム MKAnnotation クラスを作成しようとしていますが、このエラーが発生し続けます:

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-    [AnnotationForId setCoordinate:]: unrecognized selector sent to instance 0x16f63340'

作成方法を調べてみましたが、オンラインで見つけたものに従いましたが、なぜこのエラーが発生し続けるのか混乱しています。

これが私のカスタム注釈クラスです。

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

@interface AnnotationForId : NSObject <MKAnnotation >{
    NSString *title;
    NSString *subtitle;
    CLLocationCoordinate2D coordinate;
    NSInteger shopId;
}
@property(nonatomic)NSInteger shopId;
@property (nonatomic,  copy) NSString * title;
@property (nonatomic, copy) NSString * subtitle;
@property (nonatomic, readonly) CLLocationCoordinate2D  coordinate;
@end

プロパティ変数を .m クラスに合成しました。

メインコントローラーでカスタムクラスを呼び出そうとします:

for(Shop *shops in feed.shops){
        NSLog(@"reached");
        AnnotationForId *shop = [[AnnotationForId alloc] init];
        CLLocationCoordinate2D coords = CLLocationCoordinate2DMake(shops.latitude, shops.longitude);
        shop.coordinate = coords;
        //[[CLLocationCoordinate2DMake(shops.latitude, shops.longtitude)]];
        shop.title = shops.name;
        shop.subtitle = @"Coffee Shop";
        [map addAnnotation:shop];
    }

これが機能しない理由についての助けは素晴らしいでしょう。ありがとう。

4

3 に答える 3

2

readonly プロパティを設定しようとしているようです。

読み取り専用として宣言しました:

@property (nonatomic, readonly) CLLocationCoordinate2D  coordinate;

しかし、あなたはセッターを使おうとしています:

shop.coordinate = coords;

readonlyは、他のクラスが利用するセッターが定義されないことを意味します。

編集:AnnotationForId次のような便利な初期化子をクラス に追加する必要があると思います:

-(id)initWithCoordinate:(CLLocationCoordinate2D)coord
{ 
    self = [super init]; // assuming init is the designated initialiser of the super class
    if (self)
    { 
        coordinate = coord;
    }
    return self;  
}

したがって、コードは次のようになります。

for(Shop *shops in feed.shops){
        NSLog(@"reached");
        CLLocationCoordinate2D coords = CLLocationCoordinate2DMake(shops.latitude, shops.longitude);
        AnnotationForId *shop = [[AnnotationForId alloc] initWithCoordinate:coords];
        //[[CLLocationCoordinate2DMake(shops.latitude, shops.longtitude)]];
        shop.title = shops.name;
        shop.subtitle = @"Coffee Shop";
        [map addAnnotation:shop];
    }
于 2013-03-28T13:17:14.923 に答える
1

これは、カスタム AnnotationView を作成する方法の簡単な例です。

カスタムを作成AnnotationView:

#import <MapKit/MapKit.h>

@interface AnnotationView : MKPlacemark

@property (nonatomic, readwrite, assign) CLLocationCoordinate2D coordinate;

@property (nonatomic, strong) NSString *title;
@property (nonatomic, strong) NSString *subtitle;

// you can put here any controllers that you want. (such like UIImage, UIView,...etc)

@end

そして、.m file

#import "AnnotationView.h"

@implementation AnnotationView

- (id)initWithCoordinate:(CLLocationCoordinate2D)coordinate addressDictionary:(NSDictionary *)addressDictionary
{
    if ((self = [super initWithCoordinate:coordinate addressDictionary:addressDictionary]))
    {
        self.coordinate = coordinate;
    }
    return self;
}

@end

// 関連する Annotation Add を使用#import "AnnotationView.h"します.m file:

CLLocationCoordinate2D pCoordinate ;
pCoordinate.latitude = LatValue;
pCoordinate.longitude = LanValue;

// Create Obj Of  AnnotationView class  

AnnotationView *annotation = [[AnnotationView alloc] initWithCoordinate:pCoordinate addressDictionary:nil] ;

    annotation.title = @"I m Here";
    annotation.subtitle = @"This is Sub Tiitle";

[self.mapView addAnnotation:annotation];

上記は の作成方法の簡単な例ですAnnotationView

于 2013-03-28T13:23:27.507 に答える
0

プロパティを読み取り専用として指定しました。これにより、プロパティの getter メソッドのみが設定されます。そのため、プロパティを保持して、もう一度試してください。

于 2013-03-28T13:19:15.773 に答える