SORU
23 ŞUBAT 2010, Salı


Nasıl NSUserDefaults özel nesneleri saklamak için

Tamam, biraz kurcalarken yaptim, ve benim sorunum biliyorum ama nasıl düzelteceğimi bilmiyorum. Özel bir sınıf bazı verileri tutmak için yaptım. Bu sınıfın nesneleri yaparım, oturumlar arasında son ihtiyacım var. Önce ben NSUserDefaults, tüm bilgilerimi koyuyordu ama bu işe yaramıyor.

-[NSUserDefaults setObject:forKey:]: Attempt to insert non-property value '<Player: 0x3b0cc90>' of class 'Player'.

Özel Dersim koyduğumda aldığım hata mesajı ise"", NSUserDefaults. Oyuncu Şimdi, görünüşe göre NSUserDefaults sadece bazı bilgileri depolayan okudum diyorum. Ben nasıl NSUSerDefaults içine eşyalarımı almak?

Bir şekilde "" benim özel nesne ve o zaman koymak, ama bunu uygulamak için nasıl bir yardım mutluluk duyacağız! emin değilim kodlamak için olması gerektiğini okumuştum Teşekkür ederim!

******** EDİT

Aşağıda verilen kod (Teşekkürler!), birlikte çalıştığım çok iyi, ama hala bazı sorunlar yaşıyorum. Temelde, kodu, herhangi bir hata vermez neden çünkü emin değilim şimdi ve çöker. Belki de temel şeyleri kaçırıyorum ve çok yorgunum, ama göreceğiz. Burada Özel Dersim uygulanması, "": . Oyuncu

@interface Player : NSObject {
    NSString *name;
    NSNumber *life;
    //Log of player's life
}
//Getting functions, return the info
- (NSString *)name;
- (int)life;


- (id)init;

//These are the setters
- (void)setName:(NSString *)input; //string
- (void)setLife:(NSNumber *)input; //number    

@end

Dosya Uygulama:

#import "Player.h"
@implementation Player
- (id)init {
    if (self = [super init]) {
        [self setName:@"Player Name"];
        [self setLife:[NSNumber numberWithInt:20]];
        [self setPsnCounters:[NSNumber numberWithInt:0]];
    }
    return self;
}

- (NSString *)name {return name;}
- (int)life {return [life intValue];}
- (void)setName:(NSString *)input {
    [input retain];
    if (name != nil) {
        [name release];
    }
    name = input;
}
- (void)setLife:(NSNumber *)input {
    [input retain];
    if (life != nil) {
        [life release];
    }
    life = input;
}
/* This code has been added to support encoding and decoding my objecst */

-(void)encodeWithCoder:(NSCoder *)encoder
{
    //Encode the properties of the object
    [encoder encodeObject:self.name forKey:@"name"];
    [encoder encodeObject:self.life forKey:@"life"];
}

-(id)initWithCoder:(NSCoder *)decoder
{
    self = [super init];
    if ( self != nil )
    {
        //decode the properties
        self.name = [decoder decodeObjectForKey:@"name"];
        self.life = [decoder decodeObjectForKey:@"life"];
    }
    return self;
}
-(void)dealloc {
    [name release];
    [life release];
    [super dealloc];
}
@end

O benim sınıf, oldukça düz ileri, benim nesneler yapmaya çalıştığını biliyorum. Burada AppDelegate dosyası ilgili bölümleri şifreleme ve şifresini fonksiyonları diyorum):

@class MainViewController;

@interface MagicApp201AppDelegate : NSObject <UIApplicationDelegate> {
    UIWindow *window;
    MainViewController *mainViewController;
}

@property (nonatomic, retain) IBOutlet UIWindow *window;
@property (nonatomic, retain) MainViewController *mainViewController;

-(void)saveCustomObject:(Player *)obj;
-(Player *)loadCustomObjectWithKey:(NSString*)key;


@end

Ve sonra uygulama önemli parçalarından dosya:

    #import "MagicApp201AppDelegate.h"
    #import "MainViewController.h"
    #import "Player.h"

    @implementation MagicApp201AppDelegate


    @synthesize window;
    @synthesize mainViewController;


    - (void)applicationDidFinishLaunching:(UIApplication *)application {
    NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
        //First check to see if some things exist
        int startup = [prefs integerForKey:@"appHasLaunched"];
        if (startup == nil) {
//Make the single player 
        Player *singlePlayer = [[Player alloc] init];
        NSLog([[NSString alloc] initWithFormat:@"%@\n%d\n%d",[singlePlayer name], [singlePlayer life], [singlePlayer psnCounters]]); //  test
        //Encode the single player so it can be stored in UserDefaults
        id test = [MagicApp201AppDelegate new];
        [test saveCustomObject:singlePlayer];
        [test release];
}
[prefs synchronize];
}

-(void)saveCustomObject:(Player *)object
{ 
    NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
    NSData *myEncodedObject = [NSKeyedArchiver archivedDataWithRootObject:object];
    [prefs setObject:myEncodedObject forKey:@"testing"];
}

-(Player *)loadCustomObjectWithKey:(NSString*)key
{
    NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
    NSData *myEncodedObject = [prefs objectForKey:key ];
    Player *obj = (Player *)[NSKeyedUnarchiver unarchiveObjectWithData: myEncodedObject];
    return obj;
}

Eeee, pardon tüm kod hakkında. Yardım etmeye çalışıyorum sadece. Basitçe, uygulamayı başlatmak ve hemen sonra kilitlenmesine. App şifreleme kısmı için aşağı indirdim, o çöker nerede, ben yanlış bir şey yapıyorum ama ne olduğundan emin değilim. Yine takdir yardım, teşekkür ederim!

(Henüz çalışma şifreleme almadım gibi şifresini çözmek için, henüz görmedim.)

CEVAP
23 ŞUBAT 2010, Salı


Oyuncu sınıfı, aşağıdaki iki yöntemden (bir şey kendi nesne ile ilgili encodeObject çağrıları yerine) uygulamak:

- (void)encodeWithCoder:(NSCoder *)encoder {
    //Encode properties, other class variables, etc
    [encoder encodeObject:self.question forKey:@"question"];
    [encoder encodeObject:self.categoryName forKey:@"category"];
    [encoder encodeObject:self.subCategoryName forKey:@"subcategory"];
}

- (id)initWithCoder:(NSCoder *)decoder {
    if((self = [super init])) {
        //decode properties, other class vars
        self.question = [decoder decodeObjectForKey:@"question"];
        self.categoryName = [decoder decodeObjectForKey:@"category"];
        self.subCategoryName = [decoder decodeObjectForKey:@"subcategory"];
    }
    return self;
}

Okuma ve NSUserDefaults yazma:

- (void)saveCustomObject:(MyObject *)object key:(NSString *)key {
    NSData *encodedObject = [NSKeyedArchiver archivedDataWithRootObject:object];
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    [defaults setObject:encodedObject forKey:key];
    [defaults synchronize];

}

- (MyObject *)loadCustomObjectWithKey:(NSString *)key {
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    NSData *encodedObject = [defaults objectForKey:key];
    MyObject *object = [NSKeyedUnarchiver unarchiveObjectWithData:encodedObject];
    return object;
}

Kod utanmadan ödünç: saving class in nsuserdefaults

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Dive In

    Dive In

    17 Temmuz 2013
  • Matt Harding

    Matt Harding

    23 Mayıs 2006
  • paikimchung

    paikimchung

    12 Mayıs 2006