看板 MacDev 關於我們 聯絡資訊
※ 引述《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:http://bit.ly/bRcOfO 網路上的文章,供大家參考 08/12 17:23
copyshaft:NSViewController, the New C in MVC - Pt. 1 of 3 08/12 17:24