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

Posted

技术标签:

【中文标题】使用 NSCoder 进行视图之间的恢复 (viewWillAppear / viewWillDisappear)【英文标题】:Using NSCoder for restoration between views (viewWillAppear / viewWillDisappear) 【发布时间】:2014-02-16 07:24:05 【问题描述】:

我想知道在使用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】:

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

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

【讨论】:

以上是关于使用 NSCoder 进行视图之间的恢复 (viewWillAppear / viewWillDisappear)的主要内容,如果未能解决你的问题,请参考以下文章

使用 NSCoder 编码 NSArray 或 NSDictionary

选择一个视图在android中的2个视图之间显示?

使用 NSCoder 编码数组

SKSpriteNode 在 init(NSCoder) 中设置颜色

如何通过使用angularJS单击另一个组件的按钮来更改一个组件的视图?

使用 Terraform 在可用性区域(单个区域)之间进行 Azure 恢复服务 VM 复制