知道归档的最佳实践是什么吗?NSViewController
在窗口内resume(用户界面保存)目的是什么?我尝试将其存档在窗口控制器中encodeRestorableStateWithCoder:
方法只是为了发现视图控制器在以下情况下不会被取消归档restoreStateWithCoder:
叫做。
// NSWindowController subclass
-(void)encodeRestorableStateWithCoder:(NSCoder *)coder
{
[super encodeRestorableStateWithCoder:coder];
NSViewController* contentViewController = self.contentViewController;
if (contentViewController) {
[coder encodeObject:contentViewController forKey:BSContentViewControllerResumeKey];
}
}
-(void)restoreStateWithCoder:(NSCoder *)coder
{
[super restoreStateWithCoder:coder];
NSViewController* contentViewController = [coder decodeObjectForKey:BSContentViewControllerResumeKey];
if (contentViewController) {
// somehow this never get executed since contentViewController always comes out nil
self.contentViewController = contentViewController;
}
}
请注意,此视图控制器包含管理自己的子视图的其他视图控制器,因此需要在NSCoder
实例 – 只需传递提供的coder
对象向下将导致存档中的名称冲突。
提前致谢!
状态恢复工作免费NSView
但被忽略NSViewController
即使它作为子类实现这些方法NSResponder
。我想这是因为窗口不知道 NSViewControllers 可能拥有它包含的一些视图。
在 OS X Yosemite 上它应该可以工作NSWindow
现在真正支持 NSViewControllers,但在我的测试用例中并不支持。我猜这是因为人们需要使用新的 API 来“链接” NSViewController 来添加/删除它们,而不是在侧面创建它们,然后将它们的视图直接添加到窗口中。如果您想让您的应用程序在 Yosemite 之前的系统上运行,后者实际上是必需的。
以下是让它始终正常工作的方法:只需代理之间的恢复 API 调用NSView
and NSViewController
.
子类NSView
像这样:
@interface GIView : NSView
@property(nonatomic, weak) GIViewController* viewController; // Avoid retain-loops!
@end
@implementation GIView
- (void)setViewController:(GIViewController*)viewController {
_viewController = viewController;
}
- (void)encodeRestorableStateWithCoder:(NSCoder*)coder {
[super encodeRestorableStateWithCoder:coder];
[_viewController encodeRestorableStateWithCoder:coder];
}
- (void)restoreStateWithCoder:(NSCoder*)coder {
[super restoreStateWithCoder:coder];
[_viewController restoreStateWithCoder:coder];
}
@end
And NSViewController
像这样:
@interface GIViewController : NSViewController
@end
@implementation GIViewController
- (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
if ((self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil])) {
self.view.viewController = self; // This loads the view immediately as a side-effect
}
return self;
}
- (void)dealloc {
self.view.viewController = nil; // In case someone is still retaining the view
}
- (void)invalidateRestorableState {
[self.view invalidateRestorableState];
}
@end
现在你可以打电话-invalidateRestorableState
来自NSViewController
子类和 Cocoa,认为它正在与NSView
,会自动调用-encodeRestorableStateWithCoder:
and -restoreStateWithCoder:
在你的NSViewController
根据需要子类化。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)