使用NSCoder进行视图之间的恢复(viewWillAppear / viewWillDisappear)

时间:2014-02-16 07:24:06

标签: ios objective-c nscoding viewwillappear state-restoration

我想知道使用UINavigationBar使用NSCoder后退箭头来回导航到我的主菜单时是否有办法维护用户输入。我目前正在使用NSCoder在后​​台/终止/重启期间维护此数据,并NSUserDefaults在视图之间维护数据,但NSCoderNSUserDefaults的组合会产生不可预测的结果。有时,两种类型的恢复都有效,但有时BG / Term / RS恢复不起作用,我说的是在我的设备上加载相同的相同代码。当NSUserDefaults代码被注释掉时,BG / Term / RS恢复每次都有效。

我想知道是否可以使用NSCoder来满足我的所有恢复需求,如果是,那么代码会是什么样子。

这就是我用于BG / Term / RS恢复的原因:

-(void)encodeRestorableStateWithCoder:(NSCoder *)coder {
    // start level text
    [coder encodeObject:_startLevel.text forKey:@"startText"];

    // stop level text
    [coder encodeObject:_stopLevel.text forKey:@"stopText"];
}

-(void)decodeRestorableStateWithCoder:(NSCoder *)coder {
    // start level text
    _startLevel.text = [coder decodeObjectForKey:@"startText"];

    // stop level text
    _stopLevel.text = [coder decodeObjectForKey:@"stopText"];
}

这是我目前用来在我的菜单和主视图之间来回保存数据的NSUserDefaults代码,我希望将其替换为NSCoder解决方案:

- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];

    // start level
    [[NSUserDefaults standardUserDefaults] setObject:_startLevel.text 
                                              forKey:@"startLevelRestore"];
    // stop level
    [[NSUserDefaults standardUserDefaults] setObject:_stopLevel.text 
                                              forKey:@"stopLevelRestore"];
    [[NSUserDefaults standardUserDefaults] synchronize];
}

- (void)viewWillAppear:(BOOL)animated {
        [super viewWillAppear:animated];

        // start level
        [_startLevel setText:[[NSUserDefaults standardUserDefaults]
                                     objectForKey:@"startLevelRestore"]];

        // stop Level
        [_stopLevel setText:[[NSUserDefaults standardUserDefaults] 
                                     objectForKey:@"stopLevelRestore"]];

        [[NSUserDefaults standardUserDefaults] synchronize];    
    }

我一直在与这个问题作斗争几天没有运气。任何帮助将不胜感激!谢谢。

1 个答案:

答案 0 :(得分:0)

而不是在decodeRestorableStateWithCoder中设置UI对象:使用成员变量。

然后在viewWillAppear中:使用成员变量(如果已设置),否则使用NSUserDefault中的值。