2016-04-04 22 views
1

Ich habe ein Dokumentfenster, das eine Anzahl von NSView-Unterklassen enthält, zwischen denen mithilfe eines Registersteuerelements umgeschaltet wird. Jede der Unterklassen und der ViewController des Fensters unterstützen verschiedene Benutzeraktionen, auf die über Menüelemente zugegriffen wird, die mit dem First Responder verknüpft sind.performSegueWithIdentifier aus einer NSView-Unterklasse?

Ich möchte als Reaktion auf einen Menüeintrag einen Übergang von einer dieser Ansichten durchführen. NSView unterstützt performSegueWithIdentifier jedoch nicht, es scheint, dass es etwas ist, das nur Teil von NSViewController ist.

Kann jemand einen Weg vorschlagen? Ich habe Vorschläge gesehen, um den VC in die Ansichten zu bringen, aber ich weiß nicht, wie ich das machen soll. Oder vielleicht gibt es einen besseren Weg?

+0

Da die '@ IBAction's mit First Responder verbunden sind, konnten Sie die Aktion nicht im View Controller erfassen und die Aktion abhängig von der aktiven Ansicht ausführen. – vadian

+0

Ja, aber die Aktion hängt von Informationen ab, die für die Ansicht privat sind - speziell die Auswahl in einer 'NSTableView'. Ich könnte das entlarven, aber es scheint falsch zu sein. –

+0

Normalerweise * kontrollieren * Sie den Arbeitsablauf vom * Steuerelement * ler, wenn Sie Zugriff auf die Ansicht (en) haben. Eine Alternative besteht darin, das Protokoll/Delegiertenmuster zu verwenden, um Daten zurück an den Controller zu senden. – vadian

Antwort

3
view.containingController.performSegue() 

Anmerkung: Sie haben containingController auf Ihre Ansichten

hinzufügen ich die Viewcontroller an den Responder-Kette hinzufügen würde und dann containingController eine berechnete Eigenschaft in einer Verlängerung machen!

z.B. füge VC als Antwortsender hinzu:

override func awakeFromNib() { 
    super.awakeFromNib() 
    self.nextResponder = self.view 
    for subview in self.view.subviews { 
     subview.nextResponder = self 
    } 
} 

z.B. containingController in Verlängerung

extension NSView { 

    var containingController: NSViewController? { 
     get { 
      while(self.nextResponder != nil) { 
       if(self.nextResponder is NSViewController) { 
        return self.nextResponder 
       }     
      } 
      return nil 
     } 
    } 
} 
+0

Hinweis Erweiterung aus dem Speicher geschrieben .. Es könnte ein Fehler oder Syntaxfehler sein, aber Sie sollten die Idee –

+0

Hinweis: nicht wirklich den Weg zu gehen. ein Delegierter wäre sauberer IMO –

+0

Ich akzeptiere das trotzdem, weil es Sekunden dauerte, um das Problem zu implementieren und zu lösen. Ja, ich weiß, dass ich das System missbrauche, aber manchmal ist das weniger schreibgeschützt, als es "richtig" zu machen. Dies ist ein Beispiel. –

1

Sie könnte das tun (siehe Daij-Djan Antwort), aber es ist nicht das, was ich empfehlen würde, da ein hypothetisches Programmierer, der Ihren Code verwenden, ist aber nicht mit ihm vertraut (lassen Sie uns sagen Sie, Sie in einem Jahr :)) könnte durch solches Verhalten überrascht werden.

Ich würde Ihnen empfehlen, einen Delegaten (entsprechend Ihrem benutzerdefinierten Protokoll, nennen wir es MyViewDelegate) zu Ihrem NSView mit einer Methode wie viewRequiresToPerformTransition(view: YourViewSubclass) hinzuzufügen. Dann implementieren Sie diese Methode (allgemeiner entsprechen Sie dem Protokoll MyViewDelegate) in Ihrem View-Controller und führen innerhalb ihrer Implementierung alle gewünschten Segmente aus.

+1

Ich stimme zu 100% mit FreeNickname überein. Meiner macht einfach mehr Spaß: D –

+0

Ok ich bekomme die Idee, aber wie setze ich den Delegaten in die Sicht? Ich möchte das nicht während der VCs machen, da die Ansichten nur dann aktualisiert werden, wenn sie in der Tab-Ansicht sichtbar sind. –

+0

@MauryMarkowitz, wenn Ihr View-Controller in einem 'UITabBarViewController' enthalten ist, können Sie den Delegaten beispielsweise in' viewWillAppear' (des verschachtelten VC) setzen.Oder in dem Teil des Codes, der dafür verantwortlich ist, die Ansicht anzuzeigen, wenn sie anfänglich ausgeblendet ist. – FreeNickname

Verwandte Themen