我已经子类化了一个 nsview 并想要实现恢复功能。在我退出应用程序之前,编码代码会运行:
-(void)encodeRestorableStateWithCoder:(NSCoder *)coder
{
[coder encodeObject:[NSValue valueWithRect:self.originalFrame] forKey:@"originalFrame"];
[super encodeRestorableStateWithCoder:coder];
}
再次启动应用程序时,restoreStateWithCoder 永远不会被调用?
我刚刚遇到了同样的问题,并在 NSUserInterfaceItemIdentification 协议参考中找到了解决方案:
在窗口恢复操作期间使用标识符来唯一地 识别应用程序的窗口。你可以设置这个值 以编程方式或在 Interface Builder 中生成字符串。如果您创建一个项目 在 Interface Builder 中,不要为此字符串设置值,这是一个唯一的 加载 nib 文件时会为该项目创建值。 对于 以编程方式创建的视图,您通常在之后设置此值 创建该项目,但在将其添加到窗口之前。
我确实以编程方式创建了视图,因此没有为其设置标识符,并且窗口恢复机制没有调用视图恢复方法。
在将视图添加到窗口之前,您需要设置一个标识符,如下所示:
_exampleView.identifier = @"ExampleIdentifier";
如果您的视图随后调用
[self invalidateRestorableState]
,系统将在适当的时间调用 encodeRestorableStateWithCoder
,一切都会按预期进行。