0

カスタム オブジェクトを NSUserDefults に保存します。オブジェクトには複数のプロパティがあります。AppDelegate でカスタム オブジェクトの値を初期化します。私の問題は、viewcontroller didLoad メソッドでカスタム オブジェクト プロパティ「userToken」を取得しようとすると、機能することです。データは正しいですが、ビューコントローラーの別のメソッドでデータを取得すると、他のプロパティ「uId」が正しい値を返し、同じ方法でオブジェクトを取得していることに注意してください。

私はここで何を間違えましたか?助けて本当に感謝しています

オブジェクトを保存して取得する方法は次のとおりです

+(void)SaveUser:(User *)user
{
    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
    NSData *userData = [NSKeyedArchiver archivedDataWithRootObject:user];
    [userDefaults setObject:userData forKey:@"User"];  
    [userDefaults synchronize]; 
}

+(User*)retrieveUser
{
    NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];
    NSData *userData = [ud objectForKey:@"User"];
    User *user = [NSKeyedUnarchiver unarchiveObjectWithData:userData];
    return user;    
}

これが User オブジェクトの実装です

- (id)initWithCoder:(NSCoder *)decoder 
{
   self = [super init];
   if (self)
   {    
        //uId and userToken are of type NSString
        self.uId = [decoder decodeObjectForKey:@"UID"];
        self.userToken = [decoder decodeObjectForKey:@"DeviceToken"];
   }
   return self;
}

- (void)encodeWithCoder:(NSCoder *)encoder 
{
    [encoder encodeObject:self.uId forKey:@"UID"];
    [encoder encodeObject:self.userToken forKey:@"DeviceToken"];
}
4

1 に答える 1

1

これを試してください:+は、クラスプロパティにアクセスできなかった静的関数が、saveuserまたはretrieveuser関数内のすべてのものを、クラス外の別のメソッドを呼び出さずにデコードすることを意味することにも注意してください。そのため、loadviewの外で使用すると、+メソッドは常にnull値を取得する可能性があります

+(void)SaveUser:(User *)user
{
    NSUserDefaults *UserDefaults = [NSUserDefaults standardUserDefaults];
    [UserDefaults setObject:[NSKeyedArchiver archivedDataWithRootObject:user] forKey:@"User"];
    [UserDefaults synchronize];
}

+(User*)retrieveUser
{
    NSUserDefaults *UserDefaults = [NSUserDefaults standardUserDefaults];
    NSData *userData = [UserDefaults objectForKey:@"User"];
    User *user = [NSKeyedUnarchiver unarchiveObjectWithData:userData];
    return user;
}
于 2012-07-01T09:22:28.287 に答える