作者zonble (zonble)
看板MacDev
标题Re: [问题] Saving a NSWindow's position into th …
时间Thu Aug 12 00:30:20 2010
※ 引述《copyshaft (冒烟的洋葱)》之铭言:
: 2. 以自定字串(见程式码)取代 [window representedFilename]
: 在init 呼叫 setFrameAutosaveName 回传BOOL一直是NO
: Note: 在Interface Builder的attribute inspector
: 针对该Window/Panel 可直接设定autosave name。
: 不过透过以上程式做设定却不成功。
: 恳请版上的朋友能指点我理解上的盲点和范例程式上的错误。
: 感激不尽。
我们来看程式
- (MyPanelController *)init
{
NSWindow *window = [self window];
[[window windowController] setShouldCascadeWindows:NO];
[window setFrameAutosaveName:@"com.smokyonion.MyPanelFrameAutosaveName"]);
return [super initWithWindowNibName:@"MyPanel"];
}
第一:你在 [super initWith...] 之前,就想要存取成员
变数,这个时候连 self 都还没有产生,又怎麽可能拿到
[self window] 呢?
第二:MyPanelController 继承自 NSWindowController,
NSWindowController 的行为是 lazy loading,大概是到了
呼叫 [NSWindowController showWindow:] 的时候,才会去
载入 nib,也是这个时候才会有 [self window] 物件。
然後是另外几个问题
- (void)awakeFromNib
{
NSWindow *window = [self window];
[window setFrameFromString:@"com.smokyonion.MyPanelFrameAutosaveName"];
}
NSWindow 的 setFrameFromString: 不是这样用的。setFrameFromString
的用途是设定 stringWithSavedFrame 所给你的代表 frame 的
字串,而这个字串不是 autosave name。
setFrameFromString: 里头的字串,是将 NSRect 转换成 字串
表现的东西,例如:
NSRect windowFrame = NSMakeRect(,,,);
NSString *windowFrameString = NSStringFromRect(windowFrame);
[window setFrameFromString:windowFrameString];
另外:
- (void)openMyPanel:(id)sender
{
NSWindow *window = [self window];
if(![window isVisible]) [window orderFront:sender];
}
- (IBAction)closeMyPanel:(id)sender
{
NSWindow *window = [self window];
if([window isVisible]) [window orderOut:sender];
}
这两个 method 都没什麽必要,NSWindowController 自己
就已经实作了 showWindow: 跟 close: 了。
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 114.44.181.103
1F:推 copyshaft:zonble大哥,真的非常谢谢你的回覆和指教。感激不尽。 08/12 16:17
2F:推 copyshaft:修改後的版本只需要在awakeFromNib设定 08/12 16:36
3F:→ copyshaft:setFrameAutosaveName即可。 08/12 16:37
5F:→ zonble:昨天写了篇东西,有空看一下 08/12 16:54
6F:推 copyshaft:gist已更新。连结如原post. 08/12 17:14
8F:→ copyshaft:NSViewController, the New C in MVC - Pt. 1 of 3 08/12 17:24