2017-09-09 100 views
0

我試圖在ViewController中設置模態表的位置。 什麼從來就走到這一步,是這樣的:Swift模態表:willPositionSheet does not get called

import Cocoa 

class ViewController: NSViewController, NSWindowDelegate { 

    func window(_ window: NSWindow, willPositionSheet sheet: NSWindow, using rect: NSRect) -> NSRect { 
     print("function entered") 
    } 

    var sheetWindowController: SheetWindowController! 

    @IBAction func showSheet(_ sender:AnyObject){ 
     let windowController = SheetWindowController(windowNibName: "SheetWindowController") 
     self.sheetWindowController = windowController 
     self.sheetWindowController.delegate = self 
     self.view.window?.beginSheet(self.sheetWindowController.window!, completionHandler: nil) 
    } 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     self.view.window?.delegate = self 
    } 
} 

它正在儘可能的表顯示了在窗口的頂部。但willPositionSheet方法不會被調用。任何想法缺少什麼?

+0

請參閱[試圖知道當一個窗口關閉在macOS基於文檔的應用程序](https://stackoverflow.com/questions/44685445/trying-to-know-when-a-window-closes-in-a- MacOS的文檔爲基礎的應用程序)。 – Willeke

回答

1

2件事。

第一:您的視圖控制器viewwindow屬性可能不會是nonnil直到viewDidAppear()(您可以通過調試斷點來驗證該窗口是否爲nonnil)。所以確保委託實際上是在窗口上設置的。我還會注意到,你可能想要嘗試將窗口委託綁定到窗口的控制器對象或不屬於視圖控制器的獨立窗口委託對象。視圖控制器是一個奇怪的地方放這個邏輯。

二:呈現由一個NSWindowController擁有的窗口似乎並沒有得到這些回調出於某種原因(我只是路過一個標準NSWindow對象來測試和委託收到willPositionSheet調用)。不知道爲什麼會出現這種情況,但是我想這些窗口是如何設置的。據說,你可以嘗試使用更新的(10.10)NSViewController演示API來使你的生活更輕鬆。我會嘗試使用NSViewControllerpresentViewControllerAsSheet(_:)來呈現NSViewController

因此,在總結,你可以有這樣的:

override func viewDidAppear() { 
    super.viewDidAppear() 
    self.view.window?.delegate = self 
} 

,並呈現:

let vc = SheetViewController() // Note this is a view controller, not window controller 
presentViewControllerAsSheet(vc) 

希望有點幫助。