我的问题是与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?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)