web-dev-qa-db-ja.com

同じMacウィンドウに新しいView Controllerを表示するにはどうすればよいですか?

私はMac開発にかなり慣れていないため、Xcode 6の新しい「ストーリーボード」機能に少し戸惑っています。私がしようとしていることは、同じウィンドウ内のあるビューコントローラから別のビューコントローラにセグエすることです。現在のところ、すべての異なるNSViewControllerSegueは、モーダルであろうと別のウィンドウであろうと、新しいウィンドウにビューコントローラを表示します。私がしたいことは、iOSで行うのとほとんど同じように、同じウィンドウ内でセグエ処理することです(ただし、アニメーションによる移行は重要ではありません)。これはどのように達成されますか?

26
aaplmath

カスタムセグエ(NSStoryboardSegueのサブクラス)を提供すると、目的の結果を得ることができます。ただし、このアプローチにはいくつかのgotchasがあります。

  • カスタムセグエはpresentViewController:animatorしたがって、アニメーターオブジェクトを提供する必要があります
  • 表示されたビューは別のWindowオブジェクトによってサポートされていないため、基になるNSViewControllerのビューに伝達したくないマウスイベントをキャッチするためだけに、カスタムNSViewを提供する必要がある場合があります。
  • また、注意が必要なカスタムセグエのidentifierプロパティに関するSwiftのみの問題もあります。

これに関する多くのドキュメントがないように私は 小さなデモプロジェクト を作成しましたSwiftとObjective-C。

enter image description here

この質問 の回答についても詳しく説明しました。

32
foundry

(Googleで最初に関連する結果として出てきたのでこれを復活させ、私は同じ問題を抱えていましたが、カスタムセグエに対して決定しました)

カスタムセグエは機能しますが(少なくとも、ファウンドリの回答で与えられたコードはSwift 3;これはSwift 4)の更新が必要です)、まったくの作業量カスタムアニメーターの作成に携わっていると、彼らの主な使用例はカスタムアニメーションであることが示唆されます。

ウィンドウのコンテンツを変更する簡単な解決策は、ウィンドウのNSWindowControllerを作成し、そのcontentViewControllerを目的のviewControllerに設定することです。これは、ストーリーボードの一般的なパターンに従っていて、切り替えるたびに新しいViewControllerインスタンスをインスタンス化する場合に特に便利です。

しかしながら。

NSStoryboardのドキュメント は、macOSでは非常に明確に述べていますが、(遷移ではなく)封じ込めがストーリーボードの一般的な概念です利用可能なツールをもう一度見てみましょう。

このタスクには、上で概説したNSWindowControllerの代わりにNWViewControllerレイヤーを追加するコンテナービューを使用できます。私が行ってきた解決策は、NSTabViewControllerを使用することです。属性インスペクタで、スタイルを「未指定」に設定します TabViewController settings 、次にTabViewを選択し、itsスタイルを 'tabless'に設定します。 TabView selectionTabView Settings

プログラムでタブを変更するには、TabViewControllerのselectedTabViewItemIndexを設定します。

このソリューションは、タブコンテンツのViewControllersの同じインスタンスを再利用するため、ユーザーが他の「タブ」に切り替えても、テキストフィールドに入力されたデータは保持されます。

7
green_knight

同じウィンドウで現在のビューコントローラーを置き換えるセグエを含まない簡単な方法:

if let myViewController = self.storyboard?.instantiateController(withIdentifier: "MyViewController") as? MyViewController {
    self.view.window?.contentViewController = myViewController
}
3
Mark