2010-05-18 264 views
1

我想用鍵盤快捷鍵cmd-1,cmd-2,cmd-3在菜單欄上選擇三個菜單項。這我知道該怎麼做。從菜單項創建一個窗口

每個菜單項都會打開一個不同的窗口(win1,win2,win3)。

我希望它,以便只有一個每個窗口的實例被允許在任何一次打開(即只有一個WIN1,一個WIN2等)。

這是最好的方法嗎?

回答

4

如果有問題的窗口在MainMenu.nib中,則很簡單;在每個窗口上將操作附加到-makeKeyAndOrderFront:

如果,另一方面,他們在不MainMenu.nib中,因爲更容易,如果你的應用程序在一個健全的方式構成的情況;事情變得更復雜一點。長話短說;您需要將菜單項操作附加到某種控制器對象的適當方法(很可能是您的應用程序委託,儘管任何「看到」所有需要的筆尖的控制器都會這樣做);然後讓控制器發送類似的消息到其窗口。

這通常是一個明智的做法,因爲你可以連接到您的Windows較小控制器對象也採取行動,如果合適的話,作爲在有關窗口的各種視圖的數據源。

它還允許窗口的延遲加載,這是在最近的一次統計,好東西™。

如果這是某種面向文檔的方式(不一定是基於文檔的)應用程序,並且窗口顯示當前選定的「文檔」或某條數據的某些屬性;子類化NSWindowController並將窗口控制器加載到MainMenu.nib中可能是一個很好的開始。

備註:如果負責控制窗口的對象存在於響應者鏈中,則甚至不需要在MainMenu.nib中引用它們;你可以附加用來打開窗戶到虛擬FirstResponder對象適當命名IBAction秒(例如openDetailsWindow:或類似物)。 (只需將選擇添加到其已知的方法列表,你是金色的。)

重新編輯:使窗口不會出現在Windows菜單,你可以調用[window setExcludedFromWindowsMenu:YES]

要檢查/取消選中的菜單項是需要一點小技巧,因爲它需要你的窗口控制器實際上不知道有關的菜單項;但只要是這種情況,它就很簡單了;請撥打-setState:,與相關的州名(NSOffState,NSOnState),例如從窗口顯示/關閉時調用的委託方法中調用。 (這可能會再次被封裝「內部」的應用程序委託;如果出於某種原因不想讓你的MainMenu.nib中包含的窗口控制器。)

+0

在一個相關的說明。如果您在iTunes Window菜單項中查看,則可以啓動兩個窗口(iTunes和Equalizer)。當顯示這些窗口中的任何一個(或兩者)時,它們旁邊會出現一個勾號來指示這一點。此外,這兩個窗口的標題不會再出現在窗口菜單項中。我會如何模仿這個? – Garry 2010-05-19 06:04:45

+0

答覆已更新;我建議你將註釋提取到你原來的問題中(使用編輯按鈕)。讓人們稍後可以更輕鬆地找到信息。 :) – 2010-05-19 07:49:37

相關問題