macos – 如何在OSX Mavericks上呈现ViewControllerAsSheet?

macos – 如何在OSX Mavericks上呈现ViewControllerAsSheet?,第1张

概述这是一个很长的故事,但要缩短它;我的第一个OSX应用程序是在 Swift中使用故事板编写的(在Yosemite上)直到我发现我的(已完成)应用程序不会在Mavericks上运行.我需要在Mavericks上运行,所以我用NIB替换了故事板. 我的问题是与segues;我正在使用’sheet type’segues在主视图控制器上显示工作表中的其他视图控制器.调用NSViewController的p 这是一个很长的故事,但要缩短它;我的第一个OSX应用程序是在 Swift中使用故事板编写的(在Yosemite上)直到我发现我的(已完成)应用程序不会在Mavericks上运行.我需要在Mavericks上运行,所以我用NIB替换了故事板.

我的问题是与segues;我正在使用’sheet type’segues在主视图控制器上显示工作表中的其他视图控制器.调用NSVIEwController的presentVIEwControllerAsSheet方法是一个很好的替代,因为它看起来一样,但是这个API是在Yosemite中引入的 – 所以我需要弄清楚如何为Mavericks做这个.

在主视图上的按钮 *** 作中,我尝试使用beginSheet,如下所示:

secondVIEwController = SecondVIEwController(nibname: "SecondVIEwController",bundle: nil)self.vIEw.window?.beginSheet(secondVIEwController!vIEw.window!,completionHandler: nil)

但是第二个视图控制器的窗口在运行时为空.我已经尝试将新视图控制器作为子视图添加到应用程序窗口,但这是一个无法识别的选择器:

NSApplication.sharedApplication().windows[0].addSubVIEw(secondVIEwController!.vIEw)

我搜索了高低不同的描述如何显示表格,我能找到的是:Can a view controller own a sheet?但我很遗憾地承认我不明白答案.有人可以帮我一些工作代码吗?我开始担心我正在尝试做一些与众不同的事情,但在约塞米蒂看起来不错,所以人们在优胜美地被释放之前是怎么做到的?

编辑
我仍然没有解决方案,所以我已经整理了一个小应用程序,它显示了我遇到的问题.

在AppDelegate.swift中:

class AppDelegate: NSObject,NSApplicationDelegate {    @IBOutlet weak var window: NSWindow!    var mainVIEwController: FirstVIEw!       func applicationDIDFinishLaunching(aNotification: NSNotification) {        mainVIEwController = FirstVIEw(nibname:"FirstVIEw",bundle: nil)        window.contentVIEw = mainVIEwController.vIEw        mainVIEwController.vIEw.frame = (window.contentVIEw as! NSVIEw).bounds    }}

在FirstVIEw.swift中(关联的NIB有一个“打开工作表”按钮)

class FirstVIEw: NSVIEwController {    var secondVIEw: SecondVIEw?    var seconDWindow: SeconDWinCon?        overrIDe func vIEwDIDLoad() {        super.vIEwDIDLoad()    }    @IBAction func pressbutton(sender: AnyObject) {        secondVIEw = SecondVIEw(nibname: "SecondVIEw",bundle: nil)!// method 1 - this is the behavIoUr I want (but it only works on OSX 10.10)//        presentVIEwControllerAsSheet(secondVIEw!)// method 2 - this just creates a floating window//        self.vIEw.addSubvIEw(secondVIEw!.vIEw)//        self.vIEw.window?.beginSheet(secondVIEw!.vIEw.window!,completionHandler: nil)// method 3 - this also creates a floating window        seconDWindow = SeconDWinCon(windowNibname: "SeconDWinCon")        self.vIEw.window?.beginSheet(seconDWindow!.window!,completionHandler: nil)       }    }

在SecondVIEw.swift中(关联的NIB有一个’关闭’按钮)

class SecondVIEw: NSVIEwController {       overrIDe func vIEwDIDLoad() {        super.vIEwDIDLoad()    }           @IBAction func dismisspressed(sender: AnyObject) {        if (presentingVIEwController != nil) {            presentingVIEwController?.dismissVIEwController(self)        } else {            self.vIEw.window?.sheetParent?.endSheet(self.vIEw.window!)        }    }}

在SeconDWinCon.swift中(关联的NIB为空)

class SeconDWinCon: NSWindowController {    var secondVIEw: SecondVIEw?    overrIDe func windowDIDLoad() {        super.windowDIDLoad()           secondVIEw = SecondVIEw(nibname: "SecondVIEw",bundle: nil)!        self.window?.contentVIEw.addSubvIEw(secondVIEw!.vIEw)    }   }

如果取消注释方法1,您将看到我试图模拟的行为(记住它只适用于OS X 10.10).方法2或3显示第二个视图,但不显示为工作表.

解决方法@H_502_57@ 我有同样的问题,发现可能不是与视图生命周期有关的问题.
当我在vIEwDIDLoad中调用presentVIEwControllerAsSheet时,不会显示工作表,您将在控制台中获取此信息:

Failed to set (contentVIEwController) user defined inspected property on (NSWindow): presentVIEwController:animator:: VIEw ”’s vIEw is not in a window/vIEw hIErarchy.

如果你在vIEwWillAppear或vIEwDIDAppear中触发它,那完全没问题.

UPDATE

好的,让我们说清楚.

对于这个初始故事板,NSWindowController与视图控制器连接,认为这是一个根视图控制器(RootVC).
在storyboard(SheetVC)中创建另一个所需的视图控制器作为工作表.
在RootVC的vIEwWillAppear或vIEwDIDAppear中,[self presentVIEwControllerAsSheet:SheetVC]

表格将显示,无需其他代码.

总结

以上是内存溢出为你收集整理的macos – 如何在OSX Mavericks上呈现ViewControllerAsSheet?全部内容,希望文章能够帮你解决macos – 如何在OSX Mavericks上呈现ViewControllerAsSheet?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1005413.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-22
下一篇 2022-05-22

发表评论

登录后才能评论

评论列表(0条)

保存