restoreStateWithCoder 未在 NSView 中触发

问题描述 投票:0回答:1

我已经子类化了一个 nsview 并想要实现恢复功能。在我退出应用程序之前,编码代码会运行:

-(void)encodeRestorableStateWithCoder:(NSCoder *)coder
{
     [coder encodeObject:[NSValue valueWithRect:self.originalFrame] forKey:@"originalFrame"];
    [super encodeRestorableStateWithCoder:coder];
}

再次启动应用程序时,restoreStateWithCoder 永远不会被调用?

cocoa nsview restore
1个回答
3
投票

我刚刚遇到了同样的问题,并在 NSUserInterfaceItemIdentification 协议参考中找到了解决方案

在窗口恢复操作期间使用标识符来唯一地 识别应用程序的窗口。你可以设置这个值 以编程方式或在 Interface Builder 中生成字符串。如果您创建一个项目 在 Interface Builder 中,不要为此字符串设置值,这是一个唯一的 加载 nib 文件时会为该项目创建值。 对于 以编程方式创建的视图,您通常在之后设置此值 创建该项目,但在将其添加到窗口之前。

我确实以编程方式创建了视图,因此没有为其设置标识符,并且窗口恢复机制没有调用视图恢复方法。

在将视图添加到窗口之前,您需要设置一个标识符,如下所示:

_exampleView.identifier = @"ExampleIdentifier";

如果您的视图随后调用

[self invalidateRestorableState]
,系统将在适当的时间调用
encodeRestorableStateWithCoder
,一切都会按预期进行。

© www.soinside.com 2019 - 2024. All rights reserved.