Это долгая история, но ее короткое сокращение; мое первое приложение OSX было написано (на Yosemite) в Swift с помощью раскадровки, пока я не узнал, что мое (готовое) приложение не будет работать на Mavericks. Мне нужно бежать на Mavericks, поэтому я заменил раскадровку на NIB.как представитьViewControllerAsSheet на OSX Mavericks?
Моя проблема с segues; Я использовал сегменты типа «тип листа», чтобы показать другие контроллеры представлений на листе над основным контроллером. Вызов метода currentViewControllerAsSheet NSViewController является хорошей заменой, поскольку он выглядит одинаково, но этот 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?, но, к сожалению, я не понимаю ответа. Может ли кто-нибудь помочь мне с некоторым рабочим кодом? Я начинаю беспокоиться о том, что я пытаюсь сделать что-то необычное, но он выглядит хорошо на Йосемити, так как люди это делали до того, как был выпущен Йосемити?
EDIT У меня до сих пор нет решения, поэтому я собрал небольшое приложение, которое показывает проблемы, которые у меня возникают.
В 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 (связанный НСБ имеет кнопку 'открыт лист')
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 (связанный НСБ имеет 'закрыть' кнопка)
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 отображает второй вид, но не как лист.
Я хотел проголосовать @boyFarrell за помощь - метод 3 был его предложением - но у меня нет хорошей репутации. – DB1