0

我想知道在使用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];    
    }

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

4

1 回答 1

0

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

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

于 2014-03-19T10:19:53.707 回答