2010-09-06 20 views

cevap

1

Özel nesneler, no. NSUserDefaults, yalnızca birkaç temel türü (NSData, NSString, NSNumber, NSDate, NSArray veya NSDictionary) bilir.

Özel nesneyi bir dize temsiline dönüştürmek için JSON (http://code.google.com/p/json-framework/) kullanabilir, sonra bunlardan bir tanesini Varsayılanlar olarak kaydedebilir misiniz? (SetObject: forKey: yöntemini kullanarak). Aksi takdirde, sqlite, NSCoder, veya hatta fopen'e başvurmayı düşünebilirsiniz.

+0

Özel nesneler kullanmama rağmen, kaydetmeye çalıştığım şey olan NSArray'da depolanırlar. O zaman işe yaramaz mı? –

+0

"Yapmamalı mıyım?" "NSArray'da özel nesneleri depolayamıyorum?" cevap Evet. "NSUserDefaults öğesinde özel nesneler dizisini saklayamıyorum?" sonra cevap hayır, çünkü NSUserDefaults keyfi nesneleri depolayamaz. – Chuck

+0

ugh! JSON? Mükemmel bir NSCoder protokolü olduğunda? – Abizern

7

NSUserDefaults, özel nesneler dosya o bildiği tek olanları yazamazsınız yaklaşık (NSArray, NSDictionary, NSString, NSData, NSNumber ve NSDate). Bunun yerine, özel nesneleri diske kaydetmek ve geri yüklemek istiyorsanız, Archives and Serializations Programming Guide'un yanı sıra NSCoding Protocol Reference'a bir göz atmalısınız. Protokolü uygulamak çok zor değil ve çok az çalışma gerektiriyor. Eğer NSData içine dizinizi arşiv eğer

26

Hala NSUserDefaults kullanabilirsiniz. Eğer kontrol edin

NSUserDefaults *currentDefaults = [NSUserDefaults standardUserDefaults]; 
NSData *savedArray = [currentDefaults objectForKey:@"mySavedArray"]; 
if (savedArray != nil) 
{ 
     NSArray *oldArray = [NSKeyedUnarchiver unarchiveObjectWithData:savedArray]; 
     if (oldArray != nil) { 
       customObjectArray = [[NSMutableArray alloc] initWithArray:oldArray]; 
     } else { 
       customObjectArray = [[NSMutableArray alloc] init]; 
     } 
} 

: Dizideki özel nesneleri yüklemek için daha sonra bu kodu

[[NSUserDefaults standardUserDefaults] setObject:[NSKeyedArchiver archivedDataWithRootObject:myArray] forKey:@"mySavedArray"]; 

Ve kullanabilirsiniz:

dizinizi Arşivleme için aşağıdaki kodu kullanabilirsiniz Bu, kullanıcı varsayılanlarından döndürülen verilerin nil olmadığını, çünkü bu, uygulamanızı kilitleyebilir.

Yapmanız gereken diğer bir şey, özel nesnenin NSCoder protokolüne uymasını sağlamaktır. Bunu -(void)encodeWithCoder:(NSCoder *)coder ve -(id)initWithCoder:(NSCoder *)coder yöntemlerini kullanarak yapabilirsiniz.

EDIT.

-(void)encodeWithCoder:(NSCoder *)coder ve -(id)initWithCoder:(NSCoder *)coder yöntemlerinde neler koyabileceğinizi gösteren bir örnek.

- (void)encodeWithCoder:(NSCoder *)coder; 
{ 
    [coder encodeObject:aLabel forKey:@"label"]; 
    [coder encodeInteger:aNumberID forKey:@"numberID"]; 
} 

- (id)initWithCoder:(NSCoder *)coder; 
{ 
    self = [[CustomObject alloc] init]; 
    if (self != nil) 
    { 
     aLabel = [coder decodeObjectForKey:@"label"]; 
     aNumberID = [coder decodeIntegerForKey:@"numberID"]; 
    } 
    return self; 
} 
+0

Sadece bu metod tanımlarını eklemek zorunda mıyım yoksa bu yöntemlere kod koymalı mıyım? –

+0

Gönderiyi, bu yöntemlere koymak için ihtiyacınız olan bir örnekle düzenledim. – Joshua

+0

Bir çekicilik gibi çalışın. Teşekkür ederim. – jeswang

İlgili konular