0

MKAnnotation クラスを継承するオブジェクトを NSUserDefualts に保存しようとしています。iOS 6 では問題なく動作していますが、iOS 7 ではクラッシュします。保存するコードは次のとおりです。

    ParkHereAnnotation = [[catAnnotation alloc] initWithCoordinate:workingCoordinate];
    ParkHereAnnotation.title = @"Your Parked Here" ;
    ParkHereAnnotation.subtitle = @"";
    //ParkHereAnnotation.annotationType = location;
    ParkHereAnnotation.parkId = [[NSString alloc] initWithString:@"-1"];
    [ParkHereAnnotation setAnnotationType:location];
    [userDefaults setObject:ParkHereAnnotation forKey:@"ParkingAnnotation"];//Crashing here in iOS7 but not in iOS6.

クラス: ヘッダー

ヘッダー ファイル

@interface catAnnotation : NSObject <MKAnnotation>
{
    CLLocationCoordinate2D coordinate;
    NSString *title;
    NSString *subtitle;
    NSString *parkId;
    enum MapAnnotationType annotationType;
}

@property (nonatomic, assign) CLLocationCoordinate2D coordinate;
@property (nonatomic, copy) NSString *title;
@property (nonatomic, copy) NSString *subtitle;
@property (nonatomic, assign) enum MapAnnotationType annotationType;
@property (nonatomic,retain) NSString *parkId;


@end

実装

@implementation catAnnotation
@synthesize coordinate;
@synthesize title;
@synthesize subtitle;
@synthesize annotationType;
@synthesize parkId;

-(id) init
{
    return self;
}

-(id) initWithCoordinate:(CLLocationCoordinate2D)inCoord
{
    coordinate = inCoord;
    return self;
}

@end

設定前のクラスのオブジェクトは次のとおりです。 ここに画像の説明を入力

クラッシュ: * キャッチされない例外 'NSInvalidArgumentException' が原因でアプリを終了します。理由: '* -[NSUserDefaults setObject:forKey:]: キー ParkingAnnotation の非プロパティ リスト オブジェクトを挿入しようとしています' 0x31ea7c21 0x126613 0x12708f 0x126f45 0x33d3155f 0x33d314fb 0x33d314cb 0x33d1d0f3 0x33d398cd 0x33d30b0d 0x33d2bc09 0x33d00f59 0x33cff747 0x31541f27 0x315413ef 0x3153fbdf 0x314aa541 0x314aa323 0x361e12eb 0x33d611e5 0xf811d 0x3bd6aab7) libc++abi.dylib: terminating with uncaught exception of type NSException

4

2 に答える 2

3

モデル クラスはプロパティ リストのコンテンツではありません。userdefault では、string、bool、dict、array などの plist コンテンツのみを保存できます。カスタム オブジェクトを保存するには、次のようなコーダー/エンコーダー メソッドを記述する必要があります:(例)

 -(void)encodeWithCoder:(NSCoder*)coder
{
    [coder encodeObject:_title];
    [coder encodeObject:_album];
    [coder encodeObject:_pathURL];
    [coder encodeObject:_daysOfGoal];
    [coder encodeObject:_numberOfTimesPlayed];
    [coder encodeObject:_infoString];
    [coder encodeObject:_duration];
    [coder encodeObject:_numberOfTimesPlayed];
    [coder encodeObject:_dosage];
    [coder encodeObject:_creationDate];
    [coder encodeObject:_type];
    [coder encodeBool:_isAutosuggestion forKey:@"isAutosuggestion"];

}

- (id)initWithCoder:(NSCoder *)coder
{
    self = [super init];

    if(self)
    {
        [self setTitle:[coder decodeObject]];
        [self setAlbum:[coder decodeObject]];
        [self setPathURL:[coder decodeObject]];
        [self setDaysOfGoal:[coder decodeObject]];
        [self setNumberOfTimesPlayed:[coder decodeObject]];
        [self setInfoString:[coder decodeObject]];
        [self setDuration:[coder decodeObject]];
        [self setNumberOfTimesPlayed:[coder decodeObject]];
        [self setDuration:[coder decodeObject]];
        [self setDosage:[coder decodeObject]];
        [self setCreationDate:[coder decodeObject]];
        [self setIsAutosuggestion:[coder decodeBoolForKey:@"isAutosuggestion"]];

    }

    return self;
}

これらのメソッドを追加して、userdefault に保存する必要があります。

于 2013-10-23T06:38:57.327 に答える
1

iOS7 では、クラス オブジェクトを NSUserDefaults に保存することはできません。NSuserDefaults に保存する前に、クラスを辞書、配列、またはデータに変換する必要があります。NSUserDefault は、実際にはすべてのデータを Library フォルダーに格納する plist です。したがって、何かを保存したい場合は、プロパティ リストの種類に従う必要があります。

于 2013-10-23T06:42:14.547 に答える