IBのオブジェクトにXcodeからコードでアクセスする方法

このQ&Aのポイント
  • IBのオブジェクトにXcodeからコードでアクセスする方法を教えてください。
  • InterfaceBuilder上で配置したビューやウィンドウなどのコード上で定義されていないオブジェクトにコードでアクセスする方法が知りたいです。
  • InterfaceBuilderでウィンドウのアイコンから別のインスタンスにデリゲートを接続する方法ではなく、コードのみで接続する方法を教えてください。
回答を見る
  • ベストアンサー

IBのオブジェクトにXcodeからコードでアクセスするにはどうすればよ

IBのオブジェクトにXcodeからコードでアクセスするにはどうすればよいのでしょうか? InterfaceBuilder上で配置したビューや、すでにあるウィンドウなどの、 コード上で定義されていないオブジェクトに、コードでアクセスしたいのですが、やり方がわかりません。。。 例えば、最初にXcodeで新規ファイルを作ると、InterFaceBuilderのdocウィンドウ内にwindowのアイコンがすでに作られていますよね?  このNSWindowインスタンス(キーウィンドウ)から、ある別のインスタンスにデリゲートする際、 InterfaceBuilderでwindowアイコンから、その別のインスタンスにデリゲートの接続線を引っ張ることで実現していますが、 そうではなく、コードのみで接続できるのかどうか、ということが知りたいです。 ご存知の方、教えてもらえると助かります!

質問者が選んだベストアンサー

  • ベストアンサー
  • harawo
  • ベストアンサー率58% (3742/6450)
回答No.2

> Xcodeのバージョンは3.2.2、OSは10.6です。 了解しました。 ただし今回は、バージョンは関係なく、じっさいのコードを見なければ、回答できない内容でした。 Interface Builderで生成するインスタンス(AppControllerのインスタンス)は、初期化メソッド「init~」で、初期化処理を行うと、うまくいかないことが、よくあります。 今回の件でいうなら、メソッド「init」が実行される時点で、まだウインドウ「myWin」が生成されていないかもしれないからです。myWinが存在しない段階で、myWinのDelegateを指定することはできません。 Interface BuilderのNib(xib)からインスタンスがすべて生成されたことが保証されてから、初期化処理をするには、NSObjectのプロトコル「NSNibAwaking Protocol」にある、メソッド「awakeFromNib」に記述します。 - (void)awakeFromNib { [myWin setDelegate:self]; } としてみてください。

hk-sulo
質問者

お礼

早速ありがとうございます。 試してみたところ、今度はばっちりできました! それで、もう一つ疑問なのですが、IB上にあるオブジェクトにコードで定義したオブジェクトを接続するには、必ずアウトレットやバインドなどのIBでの接続操作が必要になるのでしょうか。 別の言語なのでまったく概念が違うかもしれませんが、 actionscript2.0などでは、 ステージ上に配置したインスタンスを操作したい場合、 そのインスタンスの名前をコードに記述して直接アクセスします。 こうしたことはXcodeではできない、と考えてよいでしょうか。 始めたばかりでまだわからないことが多く。。 的を外した質問かもしれませんが、 教えていただけると助かります。 よろしくお願いします!

その他の回答 (2)

  • harawo
  • ベストアンサー率58% (3742/6450)
回答No.3

> それで、もう一つ疑問なのですが、IB上にあるオブジェクトにコードで定義したオブジェクトを接続するには、必ずアウトレットやバインドなどのIBでの接続操作が必要になるのでしょうか。 できないことはないと思いますが、それをしなければならない局面というものを、どうしてもイメージすることができません。 インスタンスを、動的に操作するのなら、Interface Builderでなく、コードでインスタンスを生成するのが、ふつうです。 > 始めたばかりでまだわからないことが多く。。 > 的を外した質問かもしれませんが、 おそらくそのとおりだと思いますが、これもまた、あなたがなさりたいことを、ソースコードを見て判断しないと、なんともいいようがありません。 それと、Flashでオーサリングすることと、Cocoaプログラミングすることを、同列に並べないほうがいいでしょうね。冷凍食品を、電子レンジでチンすることと、一流料理店のシェフが、いちから調理することを、同列に並べるのと、同じことですからね。

hk-sulo
質問者

お礼

お返事、ありがとうございます。 >インスタンスを、動的に操作するのなら、Interface Builderでなく、コードでインスタンスを生成するのが、ふつうです。 まだまだそこまで到達していないので、 これから勉強したいと思います。 >それと、Flashでオーサリングすることと、Cocoaプログラミングすることを、同列に並べないほうがいいでしょうね。 そうですよね。 まだイマイチCocoaの感覚がわからず、変な例を挙げてしまいました。 すみません。。 初歩的な質問に丁寧にお答え頂き、ありがとうございました!

  • harawo
  • ベストアンサー率58% (3742/6450)
回答No.1

Xcodeのバージョンを教えてください。 Xcodeは、ひんぱんにインターフェイスを変更しているので、バージョンが0.1違っただけでも、説明が通用しないケースが、多々あります。 基本は、ヘッダファイルの「@interface」内に、「IBOutlet」と宣言して、インスタンスを記述します。

hk-sulo
質問者

補足

大切な情報が抜けておりました。すみません。 Xcodeのバージョンは3.2.2、OSは10.6です。 回答頂いた内容、「なるほど」と思って早速試してみたのですが、うまくデリゲートできません。。 おそらくコードが間違っていると思うのですが、アドバイスいただけますでしょうか。 以下に記します。 (Xcodeで新しいクラス(名前はAppController)を作り、それに記述しています) <ヘッダーファイル> #import <Cocoa/Cocoa.h> @interface AppController : NSObject <NSWindowDelegate> { IBOutlet NSWindow *myWin; } @end <実装ファイル> #import "AppController.h" @implementation AppController -(id)init { [super init]; [myWin setDelegate:self]; return self; } -(NSSize)windowWillResize:(NSWindow *)sender toSize:(NSSize)frameSize { NSSize mySize = frameSize; NSLog(@"success"); mySize.width = mySize.height * 2; return mySize; } @end アウトレットmyWinは、IBでメインのウィンドウに接続しています。 どこがまずいのか、アドバイスお願いします!

関連するQ&A

  • cocoaアプリで悩んでます。

    cocoaアプリで悩んでます。 よろしくお願いします。 Mac初心者です。 現在、cocoaAPI、Xcode3.0、InterfaceBuilder3.0(以下IB)を使ってアプリケーションを作っています。 <アプリ概要> <1>実行時に現れるダイアログにhtmlファイルをドラッグ&ドロップで貼り付けて表示。 <2>そのファイルがあるフルパスを表示。 <現状> 上記内容は実装できたのですが、<1>から<2>に進むためには設置したボタンをクリックしなければいけないような仕様になっています。 これをドラッグ&ドロップした時点で<2>の状態に進むようにしたいのです。 できるだけIBを利用したいと思っています。 WebViewクラスにはDownloadDelegate等のデリゲートが準備されているので、これを使うべきなのかなと思っているのですが、IB上で設置したインスタンスからデリゲートをどのように設定するのか、設定されたデリゲートに対するメッセージをどのように活用するのか(メソッドの引数には受け取ったメッセージを記述すべき?、どう書けば良いのか?、等)よく理解できていません。 デリゲートでメッセージを受け取った側のクラスのメソッドはどのように書けば良いかサンプルコードを記述して頂けるのであればうれしい限りです。 どうぞよろしくお願いしいます。

  • xcode インスタンス変数について

    iPhone SDKで開発を始めました、超初心者です。 xcode でインスタンス変数を、別のオブジェクトで参照したいのですが、 いろいろ試しましたが、どれもうまくいきません。 もっとも簡単な参照方法をご教授戴けると助かります。 参照したい変数は、String型です。 よろしくお願い致します。

  • Xcode、interface builderで「保存」機能の加え方を

    Xcode、interface builderで「保存」機能の加え方を教えて下さい★ 現在、Quartz Composerで作ったものを、Xcodeでアプリケーション化するのにつまずいています!! 1.Xcodeで新規プロジェクト、Quartzのフレームワークを追加 2.interface builderをmainmenu.xibファイルから起動 3.windowにQuartz Composer View、Quartz Composer parameter viewを追加 4.Quartz Composer ViewにてQuartz Composerコンポジションをロード 5.Quartz Composer parameter viewのアウトレットをQuartz Composer Viewに接続 6.Xcodeに戻り、ビルドして実行 で、とりあえずコンポジションをアプリケーション化する事が出来ました。 ここからさらに、Quartz Composer parameter viewでユーザーが変更する値を、アプリ終了時に保存させたいのですが、どうもやり方が分かりません。 いわゆる「保存」「別名で保存」「読み込み」などのメニュー機能を追加させたいのですが、なかなかうまくいきません! どうかご教授いただけないでしょうか!? Quartz Composer 3.1 Xcode 3.1.3 interface builder 3.1.2 よろしくお願いします!!

    • 締切済み
    • Mac
  • オブジェクトブラウザについて

    オブジェクトブラウザでDBに接続しようとするのですが、アクセスできません。 インスタンスもちゃんと起動しているのですが・・・。 メッセージは「ベンダーの初期化に失敗しました」とあります。 原因は何でしょうか。知っている方がいらしたら教えてください。 お願いいたします。

  • iPhone IBを使用しないでUITabBarControllerを

    iPhone IBを使用しないでUITabBarControllerを実装 - (void)applicationDidFinishLaunching:(UIApplication *)application { window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; // UIViewControllerを継承したクラス page1Controller = [[Page1Controller alloc] initWithNibName:nil bundle:nil]; page2Controller = [[Page2Controller alloc] initWithNibName:nil bundle:nil]; // 質問1 tabBarController = [[UITabBarController alloc] initWithNibName:nil bundle:nil]; [tabBarController setViewControllers:[NSArray arrayWithObjects:page1Controller, page2Controller, nil] animated:NO];  // 質問2 [window addSubview:tabBarController.view]; tabBarController.selectedIndex = 1; } 上記プログラムなのですが、 質問1.UITabBarControllerのsetViewControllersメソッドを利用して、     UIViewControllerのインスタンスをセットしているのですが、     setViewControllersメソッドは、     UITabBarControllerのプロパティviewControllersに     値をセットするためのセッターなのでしょうか? 質問2.[window addSubview:tabBarController.view]のviewは、     UITabBarControllerが継承しているUIViewControllerの     view(ゲッター)なのでしょうか? 上記の流れで、UITabBarControllerが、UIVeiwControllerを集約?しているので、 (@property(nonatomic, copy) NSArray *viewControllersとUITabBarControllerのヘルプに明記しているので) WindowのaddSubViewにセットするのは、UITabBarControllerのUIViewControllerのviewじゃないのかな? と初心者ながらの疑問です。 継承などの理解不足があると思いますが、ご教授の程お願いいたします

  • [IE7]Object要素内から親ウィンドウの独自オブジェクトを参照したい

    以下のようなウェブページを作成しています。 iframe要素の代わりにObject要素を利用しようと思い、ウェブページ内にObject要素を設けて、別なウェブページを読み込んでいます。それぞれ「親」、「子」とします。「親」も「子」それぞれ別々なJavaScriptファイルでオブジェクトを持たせています。 いま、「子」から「親」の持つオブジェクトを利用しようと思っています。今回は仮に「obj」とします。objは「親」の中でグローバルにスコープされています。 iframeの時と同じように「window.parent.obj」で「親」の持つオブジェクトにアクセスしてみました。FirefoxやOperaではアクセスが成功し、「親」の持つオブジェクトにアクセスできました。やったね(^-^) しかしInternet Explorer7のデバッグ・コンソールには「"window.parent.obj"はNullまたはオブジェクトではありません」のエラーが出ます。 ループを使ってオブジェクト「window.parent」の内容を出力してみましたが、再帰的に3回繰り返しても「obj」は含んでいませんでした。 Internet Explorer7でも「親」のオブジェクトにアクセスする方法をご存知の方、ご教授願います。不可能な場合は不可能な旨、お伝えください。

  • アクセス HasModule/コード保持をはいに

    お世話になります。 フォームにラベルBOXを配置して、プロパティーのイベントタグ内の右端の…ボタンからコードビルダーをクリックすると フォームまたはレポートにコードモジュールを追加するには、デザインビューに切り替え、フォームまたはレポートの"HasModule/コード保持"プロパティを[はい]に設定して下さい。 とメッセージが表示され先へ進めません。 デザインビュー内で「HasModule/コード保持"」のよなツールを見つけることができません 環境はWindows7,Access2010です。 宜しくお願いします。

  • windowオブジェクトを引数で送りたい

    連続ですみません、表題の件についてご教授をお願いします。 window.openで別ウィンドゥを開いていますが、 この時返ってくるwindowオブジェクトを 別の関数で使用したいのですが引き渡しができません。 やりたい事は下記のようなイメージですが、オブジェクトエラーが発生します。 winname = window.open("test.html", "win"); functest(winname); function functest(winnameF){ alert(winnameF.name); } 引渡しの方法がありましたらご指導いただけませんでしょうか。 よろしくお願いいたします。

  • オブジェクト名の変更

    お世話になります。 Accessで「レポート」および「フォーム」オブジェクトの名前を変更した場合の質問です。 名前を変更した後に、オブジェクトウィンドウに ”デザイン” ビューで表示するとそのタブは、変更後の名前に変わっています。 しかし、”レイアウト” および “フォーム” ビュー では、そのオブジェクトによってタブの名前が変更されている場合もあるし、変更されない場合もあります。 表現を変更すると ”デザイン” ビューは、必ず名前が変更される。 ”レイアウト” および “フォーム” ビュー では、オブジェクトによって、変更される場合と変更されない場合がある。 このオブジェクトの違いはどういう理由でしょうか。 よろしくお願いします。

  • ウィンドウ名からウィンドウオブジェクトを取得

    対象ブラウザはIE6~8です。 2つのウィンドウA/Bが連動するプログラムを作っています。 ウィンドウAにはウィンドウBを開くためのボタンがあり、 Aより先にBが開くことはありません。必ずAからBが派生します。 Aはwindow.openの戻り値を保持することで、B内部のJavaScriptにアクセスします。 Bはwindow.openerプロパティを経由することで、A内部のJavaScriptにアクセスします。 しかし、Aには自身をリロードする機能があり、 リロードすると保持していたBのウィンドウオブジェクトを失ってしまいます。 そこでAがリロードし終わったとき(onloadのタイミング)に、 何とかしてBのウィンドウオブジェクトを取得しなければなりません。 window.openではウィンドウに名前を付けることができますが、 その名前からウィンドウオブジェクトを取得するような、 document.getElementByNameみたいなメソッドは存在しないでしょうか? あるいは、BからAの監視を続け、リロードが終わった時に window.opener経由でメッセージを送る等の処理を実現する手段はないでしょうか? よろしくお願い致します。

専門家に質問してみよう