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

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

ただいまの
回答率

90.60%

  • Objective-C

    1172questions

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

  • Cocoa

    65questions

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

NSWindowControllerとNSViewControllerの連携方法

受付中

回答 0

投稿

  • 評価
  • クリップ 0
  • VIEW 1,887

uroshika

score 2

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

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

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

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

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

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

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

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

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

  • ただいまの回答率 90.60%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    [C] ポインタのキャスト

    NULLの定義が ((void*)0) となっているのですが、数字をvoid*にキャストするとなにを表してるのですか?

  • 解決済

    StoryBoardからのTextField紐付けに伴うSIGABRTについて

    Xcodeから新規に Master-Detail Application を作成し、 そのStoryBoard上から、Master Sceneに遷移する ViewControlle

  • 受付中

    C言語のポインタが難解とされる理由

    プログラミングC言語の学習者にとって、ポインタ(pointer)の理解は大きなハードルと言われています。 例えば「C言語 ポインタ」だけを専門に扱う入門書籍は、これまでにも大量に刊

  • 解決済

    Swiftで外部の画像ファイルを読み込めない

    Swiftでローカルに置いてある画像ファイルを読みこみたいと思い、デスクトップ上に画像bug.pngを配置してからXcode、playgroundにて以下のコードを入力しました。

  • 解決済

    swiftのUICollectionViewの更新

    swift入門者です。今サーバーのデータベースの情報をUICollectionViewCellに持ってくる作業をやっているのですが。なぜかうまくいきません。下のコードでは問題なく動

  • 解決済

    MFCのAPI GetProfileBinaryが正しくしようできません。

    MFCのAPIのGetProfileBinaryが正しく使用できないため、ご教授いただきたいです。 char型配列に格納しているバイナリデータをWriteProfileBin

  • 解決済

    C言語のポインタについて

    1、C言語のポインタについて以下のように書くとエラーが出る理由をおしえてください。 int *w; *w = 5; 2、なぜアドレスで初期化しないといけないんですか??

  • 解決済

    ViewControllerのInterfaceについて

    アプリ開発初心者です。 [目的]新たなViewControllerに機能を加えるためのファイルの場所を知る。 [現在の状況]ViewControllerを新規作成しましたが

同じタグがついた質問を見る

  • Objective-C

    1172questions

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

  • Cocoa

    65questions

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