web-dev-qa-db-ja.com

Swift with CocoaでmacOSで別のウィンドウを開くにはどうすればよいですか?

テーブルビューで顧客マスターレコードのリストを表示するmacOSアプリに取り組んでいます。テーブルビューの行をダブルクリックすると、ユーザーが顧客情報を表示および編集できる新しいウィンドウが開きます。

これは、ストーリーボードとSwiftを使用したXcode8.3.3プロジェクトです。
これはドキュメントまたはコアデータアプリではありません。

テーブルビューがレコードを正しく表示し、関連するビューコントローラがダブルクリックイベントを受信して​​コンソールに記録するまで、メインウィンドウが機能しています。

追加のウィンドウコントローラーと編集ウィンドウのビューを作成し、一時的に初期コントローラーとしてマークして、その基本的な機能を確認しました。

私が理解できなかったのは、ユーザーが行をダブルクリックしたときにそのウィンドウの新しいインスタンスを表示する方法です。

@JoshuaNozziのおかげで私は近くにいます。この時点でのコードは次のとおりです。

let storyboard = NSStoryboard(name: "Main", bundle: nil)
if let windowController = storyboard.instantiateController(withIdentifier: "xyzzy") as? NSWindowController
{
  windowController.showWindow(self)
}

それは生成しています

(ストーリーボード:0x620000000680)識別子「xyzzy」のコントローラーが含まれていません

エラー。

9
David Patterson

ウィンドウプログラミングガイド は、ウィンドウが一般的にどのように管理されているかを理解するのに最適な場所です。

具体的には(ストーリーボードでウィンドウコントローラーシーンを表示する方法を知っていると仮定して)、新しいウィンドウコントローラーへの参照を保存する場所が必要です。これにより、表示されたときにすぐに割り当てが解除(および消える)されません。

あなたの場合、開いている詳細ウィンドウの配列をマスターウィンドウコントローラーに保持して、マスターがなくなると詳細も同様になるようにすることができます。詳細ウィンドウが開いているとき(コントローラーインスタンスが作成され、そのウィンドウが表示されているとき)、そのコントローラーを配列に格納します。閉じたら、コントローラーをアレイから削除して、割り当てを解除します。

これを行うには、必要な制御の程度、子ウィンドウの所有権をどのように機能させるかなどに応じて、いくつかの方法がありますが、通常はこの基本パターンで十分です。

ストーリーボードから新しいウィンドウコントローラーシーンをインスタンス化するには:

var myWindowController = NSStoryboard(name: "MyStoryboardFileName", bundle: nil)?.instantiateControllerWithIdentifier("MyWindowControllerIdentifier") as MyWindowControllerClass
myWindowController?.showWindow(self)
11
Joshua Nozzi

確認済み。これは、UIの大きな落とし穴です。そして、起動するのはバグがあります: ストーリーボードには識別子 'MainWindow'のコントローラーが含まれていません この問題のトラブルシューティングに丸一日無駄になりました。

0
rgos