2015-05-28 18 views
0

我簡化了提問問題的代碼。iOS NSKeyedUnarchiver未獲得正確的值

我想保存更多的類和加載類模型文件。

但現在我簡化參數到模型中的一個部分(lim)(FlightSettingModel.h)。

在FlightSettingModel.h中,我在這裏設置了一些參數。

FlightSettingModel.h以下代碼:下面

#import "FlightSettingModel.h" 
@interface FlightSettingModel() 
{ 
} 
@end 
@implementation FlightSettingModel 

-(instancetype)init 
{ 
    self = [super init]; 
    if(self) 
    { 

     self.limDefaultVal = 3.0; 
     self.limCurrentVal = 4.0; 
     self.limMaxVal = 10; 
     self.limMinVal = 0; 

     // ... other property part value init .....  
    } 
    return self; 
} 


- (void)setFlightSettingToDefaultValue 
{ 
    self.limCurrentVal = self.limDefaultVal; 

} 



- (void) encodeWithCoder: (NSCoder *)encoder 
{ 
    [encoder encodeFloat:self.limCurrentVal forKey:@"limCurrentVal"]; 

} 


- (id)initWithCoder:(NSCoder *)decoder { 
    if((self = [super init])) { 
     self.limCurrentVal = [decoder decodeFloatForKey:@"limCurrentVal"]; 

    } 
    return self; 
} 
@end 

#import <Foundation/Foundation.h> 

@interface FlightSettingModel : NSObject<NSCoding> 

// lim property part 
@property float limCurrentVal; 
@property float limDefaultVal; 
@property float limMaxVal; 
@property float limMinVal; 

// .... other property part 
@end 

FlightSettingModel.m代碼然後,我已經設置了單SettingData文件初始的FlightSettingModel和其他模型類。

像下面的SettingData模型標頭:

#import <Foundation/Foundation.h> 
#import "FlightSettingModel.h" 

@interface SettingData : NSObject 

@property (nonatomic,strong) FlightSettingModel *flightSettingModel; 
+(SettingData*) sharedInstance; 

@end 

SettingData.m以下代碼:

#import "SettingData.h" 

@implementation SettingData 

SettingData *sharedInstance; 

+(SettingData*) sharedInstance{ 
    if(sharedInstance == nil) 
    { 
     sharedInstance = [SettingData new]; 

    } 
    return sharedInstance; 
} 

-(id) init{ 
    self = [super init]; 

    if(self) 
    { 

     self.flightSettingModel = [FlightSettingModel new]; 
    } 

    return self; 
} 

@end 

以我故事板(UI)是象下面這樣:

enter image description here

當我點擊保存按鈕時,我想保存自定義類模型(F lightSettingModel.h)在NSKeyedArchiver中。當我點擊加載時,我想使用NSKeyedUnarchiver從歸檔器加載模型並重置爲滑塊。

但現在,當我將滑塊拖動到其他值(例如:10),然後單擊保存,然後關閉應用程序重新啓動應用程序。我點擊加載,滑塊值將變爲0.

我不知道爲什麼當我加載的值時,所有的值都會變成0;

我的視圖控制器代碼如下.M:

#import "ViewController.h" 
    #import "SettingData.h" 

    @interface ViewController() 
    { 
    NSString *path; 
    NSString *fileName; 
} 
@end 

@implementation ViewController 

- (void)viewDidLoad { 
    [super viewDidLoad]; 

// file manage 
    path =[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES) objectAtIndex:0]; 
    fileName = [path stringByAppendingPathComponent:@"flightFile"]; 

    [self setUIValue]; 

    NSLog(@"---"); 
} 

- (void)didReceiveMemoryWarning { 
    [super didReceiveMemoryWarning]; 

} 

- (IBAction)saveAction:(UIButton *)sender { 

    [NSKeyedArchiver archiveRootObject:[SettingData sharedInstance].flightSettingModel toFile:fileName]; 
} 

- (IBAction)loadAction:(UIButton *)sender { 

    [SettingData sharedInstance].flightSettingModel = (FlightSettingModel*) [NSKeyedUnarchiver unarchiveObjectWithFile: fileName]; 
    [self setUIValue]; 

    NSLog(@"current Value:%.f",[SettingData sharedInstance].flightSettingModel.limCurrentVal); 
} 

- (IBAction)sliderChangedAction:(UISlider *)sender { 
    [SettingData sharedInstance].flightSettingModel.limCurrentVal = sender.value; 
    self.theTextField.text = [NSString stringWithFormat:@"%.f",self.theSlider.value]; 
} 

-(void) setUIValue 
{ 
    // setting slider property 
    self.theSlider.maximumValue = [SettingData sharedInstance].flightSettingModel.limMaxVal; 
    self.theSlider.minimumValue = [SettingData sharedInstance].flightSettingModel.limMinVal; 
    self.theSlider.value = [SettingData sharedInstance].flightSettingModel.limCurrentVal; 

    self.theTextField.text = [NSString stringWithFormat:@"%.f",self.theSlider.value]; 

} 

@end 

有沒有人知道我在我的代碼的問題?

非常感謝。

如果你想下載完整的代碼(代碼有問題),我在github

回答

1

發生此行爲是因爲[SettingData sharedInstance].flightSettingModel.limMaxVal[SettingData sharedInstance].flightSettingModel.limMinVal爲零上傳:

-(void) setUIValue 
{ 
    // setting slider property 
    self.theSlider.maximumValue = [SettingData sharedInstance].flightSettingModel.limMaxVal; 
    // self.theSlider.maximumValue = 0 
    self.theSlider.minimumValue = [SettingData sharedInstance].flightSettingModel.limMinVal; 
    // self.theSlider.minimumValue = 0 
    self.theSlider.value = [SettingData sharedInstance].flightSettingModel.limCurrentVal; 
    // [SettingData sharedInstance].flightSettingModel.limCurrentVal = 10 

    self.theTextField.text = [NSString stringWithFormat:@"%.f",self.theSlider.value]; 

} 

編輯:您可以通過添加這個問題來解決它:

- (void) encodeWithCoder: (NSCoder *)encoder { 
    [encoder encodeFloat:self.limCurrentVal forKey:@"limCurrentVal"]; 
    [encoder encodeFloat:self.limMaxVal forKey:@"limMaxVal"]; 
    [encoder encodeFloat:self.limMinVal forKey:@"limMinVal"]; 
} 

- (id)initWithCoder:(NSCoder *)decoder { 
    if((self = [super init])) { 
     self.limCurrentVal = [decoder decodeFloatForKey:@"limCurrentVal"]; 
     self.limMaxVal = [decoder decodeFloatForKey:@"limMaxVal"]; 
     self.limMinVal = [decoder decodeFloatForKey:@"limMinVal"]; 
    } 
    return self; 
}