iOS NSKeyedUnarchiver无法获得正确的值

时间:2015-05-28 02:42:56

标签: ios objective-c nskeyedunarchiver

我简化了提问的代码。

我想保存更多类和加载类模型文件。

但现在我将参数简化为模型中的一个部分(lim)(FlightSettingModel.h)。

在FlightSettingModel.h中,我在这里设置了一些参数。

下面的FlightSettingModel.h代码:

 #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代码

 #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

然后我将单例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

当我单击“保存”按钮时,我想在NSKeyedArchiver中保存自定义类模型(FlightSettingModel.h)。当我单击加载时,我想使用NSKeyedUnarchiver从归档器加载模型并重置为滑块。

但现在,当我将滑块拖动到其他值(例如10)时,我单击保存,然后关闭应用程序重新启动应用程序。我点击加载,滑块值将变为0。

我不知道为什么当我加载值时,all值将变为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 个答案:

答案 0 :(得分: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;
}