作者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
推 copyshaft:zonble大哥,真的非常謝謝你的回覆和指教。感激不盡。 08/12 16:17
推 copyshaft:修改後的版本只需要在awakeFromNib設定 08/12 16:36
→ copyshaft:setFrameAutosaveName即可。 08/12 16:37
→ zonble:昨天寫了篇東西,有空看一下 08/12 16:54
推 copyshaft:gist已更新。連結如原post. 08/12 17:14
→ copyshaft:NSViewController, the New C in MVC - Pt. 1 of 3 08/12 17:24