2015-05-28 2 views
0

Я упрощаю код для запроса вопроса.iOS 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

Когда я нажимаю кнопку сохранения, я хочу сохранить пользовательскую модель класса (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]; 

} 

EDIT: Вы можете исправить это, добавив:

- (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; 
} 
Смежные вопросы