私はMac開発にかなり慣れていないため、Xcode 6の新しい「ストーリーボード」機能に少し戸惑っています。私がしようとしていることは、同じウィンドウ内のあるビューコントローラから別のビューコントローラにセグエすることです。現在のところ、すべての異なるNSViewControllerSegueは、モーダルであろうと別のウィンドウであろうと、新しいウィンドウにビューコントローラを表示します。私がしたいことは、iOSで行うのとほとんど同じように、同じウィンドウ内でセグエ処理することです(ただし、アニメーションによる移行は重要ではありません)。これはどのように達成されますか?
カスタムセグエ(NSStoryboardSegueのサブクラス)を提供すると、目的の結果を得ることができます。ただし、このアプローチにはいくつかのgotchasがあります。
presentViewController:animator
したがって、アニメーターオブジェクトを提供する必要がありますidentifier
プロパティに関するSwiftのみの問題もあります。これに関する多くのドキュメントがないように私は 小さなデモプロジェクト を作成しましたSwiftとObjective-C。
この質問 の回答についても詳しく説明しました。
(Googleで最初に関連する結果として出てきたのでこれを復活させ、私は同じ問題を抱えていましたが、カスタムセグエに対して決定しました)
カスタムセグエは機能しますが(少なくとも、ファウンドリの回答で与えられたコードはSwift 3;これはSwift 4)の更新が必要です)、まったくの作業量カスタムアニメーターの作成に携わっていると、彼らの主な使用例はカスタムアニメーションであることが示唆されます。
ウィンドウのコンテンツを変更する簡単な解決策は、ウィンドウのNSWindowControllerを作成し、そのcontentViewControllerを目的のviewControllerに設定することです。これは、ストーリーボードの一般的なパターンに従っていて、切り替えるたびに新しいViewControllerインスタンスをインスタンス化する場合に特に便利です。
しかしながら。
NSStoryboardのドキュメント は、macOSでは非常に明確に述べていますが、(遷移ではなく)封じ込めがストーリーボードの一般的な概念です利用可能なツールをもう一度見てみましょう。
このタスクには、上で概説したNSWindowControllerの代わりにNWViewControllerレイヤーを追加するコンテナービューを使用できます。私が行ってきた解決策は、NSTabViewControllerを使用することです。属性インスペクタで、スタイルを「未指定」に設定します 、次にTabViewを選択し、itsスタイルを 'tabless'に設定します。
プログラムでタブを変更するには、TabViewControllerのselectedTabViewItemIndex
を設定します。
このソリューションは、タブコンテンツのViewControllersの同じインスタンスを再利用するため、ユーザーが他の「タブ」に切り替えても、テキストフィールドに入力されたデータは保持されます。
同じウィンドウで現在のビューコントローラーを置き換えるセグエを含まない簡単な方法:
if let myViewController = self.storyboard?.instantiateController(withIdentifier: "MyViewController") as? MyViewController {
self.view.window?.contentViewController = myViewController
}