2015-06-22 5 views
4

Это долгая история, но ее короткое сокращение; мое первое приложение 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 отображает второй вид, но не как лист.

ответ

0

Если вы ищете решение, я был почти там с методом 3. Важным шагом, который я пропустил, было отключить «Visible At Launch» в NIB NSWindowController (это атрибут NSWindow). В моем примере кода это было в SecondWinCon.nib.

+0

Я хотел проголосовать @boyFarrell за помощь - метод 3 был его предложением - но у меня нет хорошей репутации. – DB1

5

У меня такая же проблема, и я нашел, возможно, это проблема, связанная с просмотром жизненного цикла. Когда я звоню presentViewControllerAsSheet в viewDidLoad, лист не будет показан, и вы получите это в консоли:

Не удался установить (contentViewController) определенный пользователь досматриваемой собственность на (NSWindow): presentViewController: аниматор :: View «» 's вид не находится в иерархии окна/представления.

Если вы вызываете это в viewWillAppear или viewDidAppear, это совершенно не проблема.

UPDATE

Хорошо, давайте сделаем это ясно.

Для этой исходной раскадровки NSWindowController связан с контроллером представления, считая это контроллером корневого представления (RootVC). Создайте еще один контроллер просмотра, который нужен как лист в раскадровке (SheetVC). in viewWillAppear или viewDidAppear of RootVC, [self presentViewControllerAsSheet: SheetVC]

Лист покажет, дополнительный код не требуется.

Смежные вопросы