2009-05-15 17 views
1

背景:私はObjective-C/Cocoaの経験がない.NETの人ですが、Aaron Hillegassの著書「Cocoa Programming for Mac OS X "の基礎を掴もうとしている。 (これまでの素晴らしい本、BTW!)オプションのサイドチャレンジの1つを完了する目的で、私はユーザーが任意の場所に楕円を描画できるようにするドキュメントベースのアプリケーションを作成しています。しかし基本的なObj-C質問:オブジェクトのメソッドの呼び出し

// in OvalView.m 
@synthesize ovals; 

// in OvalDrawDocument.m 
[myOvalView setOvals:loadedOvals];    // setter? 
NSMutableArray *ovalsToSave = [myOvalView ovals]; // getter? 

OvalDrawDocument私はそうのようovalsのために自動生成されたプロパティアクセサを使用しようとしているの実装では

@interface OvalDrawDocument : NSDocument 
{ 
    IBOutlet OvalView* myOvalView; 
} 
@end 

@interface OvalView : NSView { 
    NSMutableArray *ovals; 
} 
@property (readwrite, assign) NSMutableArray *ovals; 
@end 

次のように

私は、インターフェイスを2つのクラスを持っていますコンパイラは、メソッドが見つからないことを警告し、実行時にも機能しません。彼らはCode Senseに登場しますが、実際には何も意味がないと思います(XCode/VSの違いに慣れています)Obj-Cという概念があります。事実、myOvalViewIBOutletですが、私はかなり失われています。私は何をしなければならないのですか?そしてさらに重要な理由は何ですか?


更新:私はOvalDrawDocument.mでOvalView.hを宣言しませんでした。そうすることで、コンパイルの警告が修正されました。しかし、保存と読み込みはまだ機能していないように見えますが、理由を把握できません。

リクエストに応じて、オンラインで完全なソースコードを投稿しました。BrowseまたはDownload (59KB zip)です。

+1

は@implementation OvalViewブロック内の@synthesizeの楕円ですか? – stefanB

+0

問題がどこにあるかわかるようにファイル全体を投稿してください。ほとんどの場合、間違った場所に何かがありますが、インポートされていないか宣言されていませんが、あなたが投稿したものからは分かりません。 IBOutlets/IBActionsはコードに影響を与えません。コンパイル時に除外されます。 Xcodeは適切な接続を行い、それらを削除します。 –

+1

ただ、オブジェクトやプロパティを扱うときに割り当てるのではなく、保持しておくことをお勧めします。 –

答えて

5

警告:OvalDrawDocumentation実装ファイルのOvalViewのヘッダーをインポートします。

実行時にメッセージが機能しない:実際にIBでコンセントを接続していることを確認してください。

また、マーティンピルキントンは、あなたの質問に彼のコメントで言ったように、おそらくではなく、assignとそのプロパティを宣言する必要があります。

+0

呼び出しが実行時に機能しない場合、それは(のみ)問題ではありません。 – smorgan

+0

良い点。それに応じて編集。 –

+0

ヘッダーをインポートすると警告が修正されました。アウトレットは、私の知っている限り、IBで適切に接続されています。 –

1

IBOutlet keywrodは、Interface Builderの "ヘルパー"キーワードであり、コンパイル時には何も定義されていません。関連するヘッダファイルをインポートし、myOvalViewにalloc/initを実行しましたか?

+0

ビューがすでにnibに存在する場合、なぜalloc/initを実行するのですか? –

+0

これはnibファイル内に存在していて、割り当てられていなくても、[[zzz alloc] initWithNib:@ "nib name here"]を探しています。 – tmadsen

+0

NSViewにはinitWithNib:メソッドがありません。 –

0

あなたは正しいことがあるように見えるので、コードの多くを表示しなければならないと思うので、他の場所で何かを紛失している必要があります。また、あなたがプロパティとして楕円を宣言するつもりなら、それはOvalDrawDocument内のプロパティ構文を使用するように理にかなって:

// in OvalDrawDocument.m 
myOvalView.ovals = loadedOvals;    // setter 
NSMutableArray *ovalsToSave = myOvalView.ovals; // getter