2014-07-15 72 views
2

我一直試圖獲得一個NSPopover加載NSViewController從NSStatusItem顯示,理想情況下在swift中使用segue幾個小時試圖失敗。NSPopover中的NSViewController通過從NSStatusItem中的NSStatusItem中快速10.10

我已經設法從DP3中新的NSStatusItem.button實現中正確地觸發事件,但我無法解決如何以編程方式向NSButton中添加一個segue。我有工作,到目前爲止是代碼...

class AppDelegate: NSObject, NSApplicationDelegate { 

var statusItem : NSStatusItem 

init() { 
    statusItem = NSStatusBar.systemStatusBar().statusItemWithLength(CGFloat(-2)) 

    // When the bug is fixed, replace the line above with this line. 
    //statusItem = NSStatusBar.systemStatusBar().statusItemWithLength(CGFloat(NSSquareStatusItemLength)) 
} 

override func awakeFromNib() { 
    SetupStatusItem() 
} 

func SetupStatusItem() { 
    statusItem.title = nil 
    var icon = NSImage(named: "Moon_Full.png") 
    icon.size = NSSize(width: 16, height: 16) 
    icon.setTemplate(true) 
    statusItem.button.image = icon 
    statusItem.button.action = "StatusItemClicked" 
} 

func StatusItemClicked() { 

    if (statusItem.button.appearsDisabled) 
    { 
     statusItem.button.appearsDisabled = false 
     println("Hide NSPopover here") 
    } 
    else 
    { 
     statusItem.button.appearsDisabled = true 
     println("Show NSPopover here") 
    } 
} 
} 

這將把NSStatusItem,它在光與暗模式正確的顏色,並記錄正確的信息和活動和非活動狀態之間切換。

我缺少的seceret醬是如何以編程方式將狀態添加到statusItem.button,以便它可以執行我點擊時從NSStatusItem中構建的NSPopover中的NSViewController的加載。

編輯:

我試圖在一個視圖控制器

A中的一些與香草NSButton場景)掛接在界面生成一個賽格瑞...作品

B)掛鉤一個在代碼中繼續並觸發它......可行,但您仍然必須在界面構建器中建立連接,以便解決問題。 (這是API新10.10)

performSegueWithIdentifier("ShowPop", sender: sender) 

C)試圖彈出視圖控制器在同一故事板,是錯誤發生的地方。

var newView = NSView(frame: sender.frame) 
    var popupViewController = ViewController(nibName: "PopupViewController", bundle: NSBundle(identifier: "PopupViewController")) 

    presentViewController(popupViewController,asPopoverRelativeToRect: sender.frame, ofView: newView,preferredEdge: NSRectEdge.max,behavior: NSPopoverBehavior.Transient) 

2014年7月17日08:57:55.238酥料餅[5116:2277209] - [NSNib initWithNibNamed:束:]無法加載nibName: PopupVIewController在束(空)。

(我曾嘗試命名在IB的NIB和對罵以及使用空。

d)相同的代碼工作,如果我創建一個單獨的廈門國際銀行,但我的選擇是使用新

我創建了一個樣本項目的故事板如果可能的話,我想用新的標籤視圖作爲容器......(在Objective-C,以確保這不是一個問題,迅速)

Sample ObjectiveC project

非常感謝您的幫助。

+0

只是一個快速提示:你應該名稱以小寫字母的方法。 UpperCamelCase用於類型。 – radex

+0

這就是我的C#開發年。 –

回答

1

只是不。直接使用NSPopover.showRelativeToRect(...)調用彈出窗口。我相信如果您將彈出窗口的behavior設置爲.Transient,那麼當您點擊其他地方時,它應該會自動關閉,但您需要設置它的delegate屬性以捕獲popoverDidClose事件並且不突出顯示狀態項目。

編輯:

據我所知,目前還沒有辦法以編程方式設置上的按鈕SEGUE。當你在Storyboard中設置一個segue關係時,我相信編譯的代碼,你只需要爲你設置一個執行NSStoryboardSegue的目標/動作。所以你不能做。在視圖控制器中,您可以使用presentViewController(asPopover...)快速顯示彈出窗口中的另一個視圖控制器。但是在處理NSStatusItem和NSStatusBarButton時,你不會得到一個視圖控制器,所以你必須直接做。

+0

我也試過,但是一直在誤加載未命名的筆尖時出現錯誤。 (沒有什麼比API語言更改和新的工具支持)。知道我是錯誤還是工具生成錯誤是一個真正的困難。我總是認爲我首先是錯誤的。 :-) –

+0

請貼上你得到的確切錯誤。很難在沒有看到症狀的情況下做出診斷;) – radex

3

我給出的答案是工作原理是...

popover = NSPopover() 
    popover.contentViewController = NSStoryboard(name: "PopoverStoryboard", bundle: nil).instantiateControllerWithIdentifier("PopoverStoryboardVC") as NSViewController 
    popover.behavior = NSPopoverBehavior.Transient