2017-09-09 16 views
0

ViewController에서 모달 시트의 위치를 ​​설정하려고합니다. 무엇 I've 지금까지 가지고 이 : 그것은 지금까지 시트가 창의 상단에 표시대로 작동신속한 모달 시트 : willPositionSheet가 호출되지 않습니다.

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 속성은 viewDidAppear()까지 0이 아닙니다 (중단 점을 사용하여 디버깅하여 창이 아닌지 여부를 확인할 수 있음). 따라서 위임자가 실제로 창에 설정되어 있는지 확인하십시오. 또한 윈도우의 컨트롤러 객체 또는 뷰 컨트롤러가 소유하지 않은 별개의 윈도우 델리게이트 객체에 연결된 윈도우 델리게이트를 남겨 두는 것이 좋습니다. 뷰 컨트롤러는이 로직을 배치하는 이상한 장소입니다.

둘째 : 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) 

희망이 조금 도움이

그래서 요약 당신이 뭔가를 가질 수있다.