使用 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
维护视图之间的数据,但NSCoder
和NSUserDefaults
的组合会产生不可预测的结果。有时,两种类型的恢复都有效,但有时 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
SKSpriteNode 在 init(NSCoder) 中设置颜色