2016-04-04 8 views
1

私は、タブコントロールを使用して切り替えるいくつかのNSViewサブクラスを含むドキュメントウィンドウを持っています。各サブクラスとウィンドウのViewControllerは、最初のレスポンダに関連付けられたメニュー項目からアクセスされるさまざまなユーザアクションをサポートします。NSViewサブクラスからperformSegueWithIdentifier?

メニュー項目に応じてビューのいずれかからセグを実行したいと思います。しかし、NSViewはperformSegueWithIdentifierをサポートしていません。NSViewControllerの一部であるようです。

誰かがこれを回避する方法を提案できますか? VCに意見を渡すという提案がありましたが、その方法を明確にしていません。それとももっと良い方法がありますか?

+0

'@ IBAction'がFirst Responderに接続されているため、View Controllerでアクションをキャプチャしてアクティブビューに依存するアクションを実行できませんでした。 – vadian

+0

はい、アクションはビュー専用の情報、特に 'NSTableView'の選択に依存します。私はそれを公開することができますが、それは間違っているようです。 –

+0

通常は、ビューにアクセスできるように* control * lerからワークフローを制御*します。代わりに、プロトコル/デリゲートパターンを使用してデータをコントローラに送り返すこともできます。 – vadian

答えて

3
view.containingController.performSegue() 

ノート:あなたはあなたの意見に

をcontainingControllerを追加する必要があり、私はレスポンダチェーンにViewControllerをを追加しcontainingController拡張で計算された財産になるだろう!

レスポンダとしてvcを追加:

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

延長

extension NSView { 

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

メモリから書き込まれた拡張子をメモします。間違いや構文エラーが発生する可能性がありますが、あなたはその考えを得るべきです –

+0

注:実際に行く方法ではありません。デリゲートがきれいになるIMO –

+0

私はこれを受け入れています。なぜなら、問題を実装して解決するのに数秒かかったからです。はい、私はシステムを悪用していることを知っていますが、それは "正しい方法"を実行するよりも読み取り専用ではありません。これは一例です。 –

1

にあなたは(Daij-Djanの答えを参照)が、しかし、それはあなたのコードを使用する仮想的なプログラマのために、私が推薦するものではありませんが、それに慣れていない(してみましょうというcontainingControllerを行うことができます一年であなた:))は、そのような行動によって驚いているかもしれません。

viewRequiresToPerformTransition(view: YourViewSubclass)のような方法で、代理人(カスタムプロトコルに準拠させて、それをMyViewDelegateと呼ぶ)をNSViewに追加することをお勧めします。次に、このメソッドを実装します(より一般的には、MyViewDelegateプロトコルに準拠しています)。ビューコントローラ内で、実装内では、必要なセグを実行します。

+1

私はFreeNicknameに100%同意します。私の考えは分かりますが、ビューでデリゲートを設定するにはどうすればよいですか?D –

+0

私はビューがタブビューで見えるようになると更新されるだけなので、VCの起きている間はこれをやりたいとは思わない。 –

+0

@MauryMarkowitz、あなたのビューコントローラが 'UITabBarViewController'の中に含まれている場合、例えば(入れ子にされたVCの)' viewWillAppear'でデリゲートを設定することができます。または、最初に隠されていた場合、ビューの表示を担当するコードの部分です。 – FreeNickname

関連する問題