2016-11-29 5 views
0

NSWindowControllerにはテーブルがあり、データソースとして別のコントローラを使用し、NSTableViewの代理人を使用しています。この第2のコントローラは、NSWindowControllerによって渡されるオブジェクトからの情報を表示します。そのコントローラーは、オブジェクトをAppDelegateによってプロパティとして設定します。それは次のようになります。AppDelegateNSWindowControllerに変更されないオブジェクトを渡す正しい方法は何ですか?

class SomeWindowController: NSWindowController { 
    var relevantThing: Thing! 
    var someTableController: SomeTableController! 
    @IBOutlet weak var someTable: NSTableView! 

    override func windowDidLoad() { 
     someTableController = SomeTableController(thing: relevantThing) 
     someTable.dataSource = someTableController 
     someTable.delegate = someTableController 
    } 
} 

私はその後、

func applicationDidFinishLaunching(_ aNotification: Notification) { 
    relevantThing = Thing() 
    someWindowController = SomeWindowController() 
    someWindowController.relevantThing = relevantThing 
    someWindowController.showWindow(nil) 
} 

のようなものが、これは合理的なアプローチですか? SomeWindowControllerで使用されている暗黙的にアンラップされたオプションが悪い形である可能性があります。またrelevantThingは私の場合は変更できませんので、letがもっと正しいと感じます。たぶんrelevantThingを定数にしてイニシャライザで渡す必要がありますか?または、それはinit?(coder: NSCoder)イニシャライザを壊すでしょうか?

スウィフトで正しいことを感じるように努力しているので、私は大変感謝しています。

答えて

0

いくつかのこと:

は、あなたのコードであなたの窓のコントローラを作成し、ストーリーボード/ XIBからロードされていない何らかの理由はありますか?

一般的には、ビューに関連するすべての「コントローラ」をNSViewControllerに入れて、ウィンドウ自体に関連するもの(ツールバー、ウィンドウ管理など)にのみNSWindowControllerを使用することをお勧めします。

iOSと同様に、NSViewControllerは、ウィンドウ/ビューのライフサイクルとレスポンダーチェーンに統合されました。多くのウィンドウでは、サブクラスNSWindowControllerは必要ありません。

XCodeのappプロジェクトテンプレートは、ウィンドウ、メインビュー、およびそれらのコントローラでストーリーボードを作成します。これは良い出発点です。

NSWindowControllerは、メインコンテンツビューのNSViewController(ストーリーボードからロードされたとき)に設定されたcontentViewControllerプロパティを持ちます。一般的に、View Controllerには別個のView Controllerプロパティは必要ありません。

私は通常、外部のコードからコントローラを変更し、可能な限り独立させたいと思っています。これにより、それらをよりテスト可能かつ再利用可能にする。

あなたThingインスタンスが(それはあなたのコードから表示される)、あなたはThingクラスのシングルトンインスタンスとして追加し、NSViewControllerからそれを取得検討する必要があり、アプリケーション全体のためのグローバルである場合(例えばviewDidLoad()中)

コントローラ/ビューをストーリーボードに配置すると、そこにテーブルのデータソース/デリゲートを接続できます。これをメインウィンドウにすると、アプリケーションの起動時に自動的にロードされて表示されます。しかし、いずれにせよ、あなたのNSViewController/View配線をView Controllerに入れてください。

メインのNSViewController間のロジックを、ビューの特定の部分を処理するより特殊化されたビューコントローラに分割する場合は、Interface BuilderでNSContainerViewを使用して、特定のビューを処理するビューコントローラを追加できます。

+0

ありがとうございました。あなたは私にストーリーボードをチェックするように確信しました。彼らは確かに前進しています。感謝します! –

関連する問題