質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
Objective-C

Objective-Cはオブジェクト指向型のプログラミング言語のひとつです。C言語をベースにSmalltalkが取り入れられています。

Cocoa

CocoaはMac OS X用のアプリケーションを構築する為の主要なフレームワークのひとつです。

Q&A

0回答

3867閲覧

NSWindowControllerとNSViewControllerの連携方法

uroshika

総合スコア9

Objective-C

Objective-Cはオブジェクト指向型のプログラミング言語のひとつです。C言語をベースにSmalltalkが取り入れられています。

Cocoa

CocoaはMac OS X用のアプリケーションを構築する為の主要なフレームワークのひとつです。

0グッド

0クリップ

投稿2015/02/10 09:48

Cocoa初心者なのですが、現在Document-Based アプリケーションの設計見直しを行っています。
Documentに関連づけられたWindowController(MyWindowControllerとします。)で、サブクラス化したNSViewController(MyViewControllerとします。)を管理(保持)するようにしています。

しっかりしたMVCになっているか怪しいのですが、ここではMyWindowControllerがデータの箱をもっており、データを変更するときは常にControllerを経由して変更するようにしています。
ここで、MyViewControllerからMyWindowControllerを経由してデータを更新したい場合があるのですが、こういった場合にMyViewControllerからMyWindowControllerに通知を行うにはどのようにするのがよいのでしょうか。

いくつかの方法考えてみました。

  1. MyViewControllerにMyWindowControllerのポインタ変数を用意する

用意したポインタ変数にアドレスをセットしておく事でMyWindowControllerにアクセスできるようにする。

  1. MyViewControllerのrepresentedObjectにMyWindowControllerのアドレスをセットしておく

「setRepresentedObject:(id)inObj」でWindowControllerのアドレスをセットしておき、必要なときに「representedObject」で取得してアクセスできるようにする。

  1. MyViewControllerでモデルへの参照を保持する

MyViewControllerのrepresentedObjectか、独自の変数を用意し、モデルへの参照をViewControllerで保持しておき、WindowControllerを経由せずにデータを更新する。

  1. すべてのActionをWindowControllerで受け取る

MyWindowControllerにすべてのActionを書くことで、データにアクセスできるようにする。

上記のどの方法でも、データを更新する事は可能ですが、1.、2.の方法だとControllerの階層が深くなると常に自分の親にアクセスできるように参照を保持しないといけなくなりますし、子供が常に親のことを知ってしまっている事にもなります。
3.の方法だと更新したいデータが複数ある場合等はその分の変数が必要になってしまいます。
また、4.の方法だとControllerの肥大化の原因にもなるような気がして、あまり良い設計でないように思います。

このような場合、データを更新するためにViewControllerからWindowControllerに通知を行うためにはどのような方法を取るのが良いでしょうか。
また、Cocoaではどのように行うのが一般的な手法なのでしょうか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問