gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-30 23:02:14 25 4
gpt4 key购买 nike

说来话长,言归正传;我的第一个 OSX 应用程序是使用 Storyboard在 Swift 中(在 Yosemite 上)编写的,直到我发现我的(完成的)应用程序无法在 Mavericks 上运行。我需要在 Mavericks 上运行,所以我用 NIB 替换了 Storyboard。

我的问题是segues;我正在使用“工作表类型”segues 在主视图 Controller 上的工作表中显示其他 View Controller 。调用 NSViewController 的 presentViewControllerAsSheet 方法是一个很好的替代方法,因为它看起来一样,但是这个 API 是在 Yosemite 中引入的 - 所以我需要弄清楚如何为 Mavericks 执行此操作。

在主视图上的按钮操作中,我试过像这样使用 beginSheet:

secondViewController = SecondViewController(nibName: "SecondViewController", bundle: nil)
self.view.window?.beginSheet(secondViewController!view.window!, completionHandler: nil)

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

NSApplication.sharedApplication().windows[0].addSubView(secondViewController!.view)

我到处搜索有关如何显示工作表的说明,我能找到的是:Can a view controller own a sheet?但我很遗憾地承认我不明白答案。任何人都可以帮我一些工作代码吗?我开始担心我正在尝试做一些不寻常的事情,但它在 Yosemite 上看起来不错,那么在 Yosemite 发布之前人们是怎么做到的?

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

在 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中(Associated 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 显示第二个 View ,但不显示为工作表。

最佳答案

我有同样的问题,发现可能不是与 View 生命周期相关的问题。当我在 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 中触发它,那完全没有问题。

更新

好吧,让我们说清楚。

对于这个初始 Storyboard,NSWindowController 与 View Controller 相连,将其视为 Root View Controller (RootVC)。在 Storyboard (SheetVC) 中创建另一个所需的 View Controller 作为工作表。在 RootVC 的 viewWillAppear 或 viewDidAppear 中,[self presentViewControllerAsSheet: SheetVC]

工作表将显示,无需额外代码。

关于macos - 如何在 OSX Mavericks 上呈现 ViewControllerAsSheet?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30979515/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com