2014-07-11 10 views
10

Próbuję pokazać NSViewController za pośrednictwem storyboardu (OSX). Okno otwierające będzie oknem inspektora, więc powinno być niemodalne.Storyboardy OSX - Otwórz okno modemu ze standardową segue

Kiedy tworzę segue działania przez Ctrl-przeciągnięcie z przycisku wyzwalacza do sterownika okna mam oferowanych następujące opcje stylu Segue:

  • modalnych
  • Arkusz
  • Popover
  • klienta

Pierwsze trzy opcje są oczywiście nieodpowiednie.

Jestem pewna, że ​​mogę utworzyć niestandardową zmianę, aby pokazać widok. Wymagałoby to stworzenia klasy, wdrożenia niektórych metod i tak dalej.

Jednakże, ponieważ moje wymagania wydają mi się dość proste, zastanawiam się, czy brakuje mi czegoś, co jest oczywiste - prosty sposób na otwarcie niemodalnego okna przez płótno.

Używam XCode6-Beta3.

+0

Czy widok kwaśny (kontroler) ma pasek nawigacji? – Drux

+0

Główne okno ma pasek nawigacji (przycisk wyzwalacza znajduje się na pasku narzędzi). Kontroler widoku, który próbuję otworzyć, nie działa. – mic

+0

Hmm .. w takim przypadku, jeśli przeciągniesz ctrl z 1. do 2. widoku w IB (i powiesz Xcode 5.1.1), nie otrzymasz również opcji "Push"? (Zakładam, że to twoja "standardowa zmiana"). – Drux

Odpowiedz

13

Przynajmniej teraz (Beta3), widok niemodalny musi mieć własne okno, a nie ma prostego sposobu na utworzenie tego przejścia.

Zamiast tego przeciągnij nowy obiekt kontrolera okien do swojej Storyboard. Pojawi się z własnym widokiem treści jako Segment Relacji. Jeśli jednak istnieje inny widok, którego chcesz użyć dla okna (np. Kontroler widoku Tab), po prostu usuń nowy kontroler widoku i przeciągnij kontrolkę z nowego kontrolera okien do kontrolera widoku, którego widok chcesz użyć do zawartość okna.

Ważne: Wybierz obiekt Okno sterownika w serii ujęć, aw Identity Inspector ustaw Storyboard identyfikator ciąg, który będzie identyfikować okna (np .: „Inspektor”).

Potem tylko napisać trochę kodu, aby wyświetlić okno:

var inspectorController: NSWindowController? 
@IBAction func showInspector(sender : AnyObject) { 
    if !inspectorController { 
     let storyboard = NSStoryboard(name: "Main", bundle: nil) 
     inspectorController = storyboard.instantiateControllerWithIdentifier 
      ("Inspector") as? NSWindowController 
    } 
    if inspectorController { inspectorController!.showWindow(sender) } 
} 

I rzeczywiście okazało się, że korzystne nie do korzystania z głównych ujęć dla wszelkich okien w ogóle. Jednym z powodów jest to, że dzięki Storyboard (przynajmniej teraz), nie ma możliwości przechwycenia początkowej segue podczas uruchamiania aplikacji, a windowWillLoad nigdy nie jest wywoływany na głównym kontrolerze okien.

Zamiast tego utwórz osobne storyboardy dla okien aplikacji i/lub dokumentów i użyj klasy AppDelegate, aby utworzyć instancję. Więcej informacji i działający przykład: in this thread.