アプリ版:「スタンプのみでお礼する」機能のリリースについて

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

InterfaceBuilder上で配置したビューや、すでにあるウィンドウなどの、
コード上で定義されていないオブジェクトに、コードでアクセスしたいのですが、やり方がわかりません。。。

例えば、最初にXcodeで新規ファイルを作ると、InterFaceBuilderのdocウィンドウ内にwindowのアイコンがすでに作られていますよね? 
このNSWindowインスタンス(キーウィンドウ)から、ある別のインスタンスにデリゲートする際、
InterfaceBuilderでwindowアイコンから、その別のインスタンスにデリゲートの接続線を引っ張ることで実現していますが、
そうではなく、コードのみで接続できるのかどうか、ということが知りたいです。


ご存知の方、教えてもらえると助かります!

A 回答 (3件)

> 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];
}

としてみてください。
    • good
    • 0
この回答へのお礼

早速ありがとうございます。

試してみたところ、今度はばっちりできました!

それで、もう一つ疑問なのですが、IB上にあるオブジェクトにコードで定義したオブジェクトを接続するには、必ずアウトレットやバインドなどのIBでの接続操作が必要になるのでしょうか。

別の言語なのでまったく概念が違うかもしれませんが、
actionscript2.0などでは、
ステージ上に配置したインスタンスを操作したい場合、
そのインスタンスの名前をコードに記述して直接アクセスします。

こうしたことはXcodeではできない、と考えてよいでしょうか。

始めたばかりでまだわからないことが多く。。
的を外した質問かもしれませんが、
教えていただけると助かります。

よろしくお願いします!

お礼日時:2010/06/11 19:05

> それで、もう一つ疑問なのですが、IB上にあるオブジェクトにコードで定義したオブジェクトを接続するには、必ずアウトレットやバインドなどのIBでの接続操作が必要になるのでしょうか。



できないことはないと思いますが、それをしなければならない局面というものを、どうしてもイメージすることができません。

インスタンスを、動的に操作するのなら、Interface Builderでなく、コードでインスタンスを生成するのが、ふつうです。

> 始めたばかりでまだわからないことが多く。。
> 的を外した質問かもしれませんが、

おそらくそのとおりだと思いますが、これもまた、あなたがなさりたいことを、ソースコードを見て判断しないと、なんともいいようがありません。

それと、Flashでオーサリングすることと、Cocoaプログラミングすることを、同列に並べないほうがいいでしょうね。冷凍食品を、電子レンジでチンすることと、一流料理店のシェフが、いちから調理することを、同列に並べるのと、同じことですからね。
    • good
    • 0
この回答へのお礼

お返事、ありがとうございます。

>インスタンスを、動的に操作するのなら、Interface Builderでなく、コードでインスタンスを生成するのが、ふつうです。

まだまだそこまで到達していないので、
これから勉強したいと思います。

>それと、Flashでオーサリングすることと、Cocoaプログラミングすることを、同列に並べないほうがいいでしょうね。

そうですよね。
まだイマイチCocoaの感覚がわからず、変な例を挙げてしまいました。
すみません。。

初歩的な質問に丁寧にお答え頂き、ありがとうございました!

お礼日時:2010/06/12 14:49

Xcodeのバージョンを教えてください。


Xcodeは、ひんぱんにインターフェイスを変更しているので、バージョンが0.1違っただけでも、説明が通用しないケースが、多々あります。

基本は、ヘッダファイルの「@interface」内に、「IBOutlet」と宣言して、インスタンスを記述します。

この回答への補足

大切な情報が抜けておりました。すみません。

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でメインのウィンドウに接続しています。

どこがまずいのか、アドバイスお願いします!

補足日時:2010/06/11 17:25
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!