2009-08-11 7 views
1

したがって、私はメインウィンドウの代理人を設定する必要があるこの演習をしようとしています。目的は、ユーザーがウィンドウのサイズを変更したときに、常にウィンドウの幅の2倍になるようにすることです。Objective Cメインアプリケーションウィンドウの代理人

これは私のAppController.hファイルです:

#import <Cocoa/Cocoa.h> 

@interface AppController : NSObject 
{ 
    NSWindow *windowWillResize; 
} 

@end 

と、これは私のAppController.mファイルです:

#import "AppController.h" 

@implementation AppController 

- (id) init 
{ 
    [super init]; 
    windowWillResize = [[NSWindow alloc] init]; 
    [windowWillResize setDelegate:self]; 

    return self; 
} 

- (NSSize) windowWillResize:(NSWindow *)sender 
       toSize:(NSSize)frameSize; 
{ 
    NSLog(@"size is changing"); 
    return frameSize; 
} 

@end 

しかし、私はライン [windowWillResize setDelegate:自己]を削除することができます。 私はInterface Builderでデリゲートを設定していますが、なぜこれが機能するのか分かりません。

私は完全に新しい windowWillResize = [[NSWindow alloc] init]を行っているので、windowWillResizeはメインアプリケーションウィンドウを参照していることをどのように知っていますか?

私はこれを完全に間違っていると感じています。誰かが私を正しい方向に向けることができますか?ありがとう!

答えて

3

実際には、新しく作成されたCocoaアプリにはすでにメインウィンドウがあるため、NSWindow *windowWilResizeを作成する必要はありません。また、-initメソッドを実装する必要はありません。

あなたは、Interface BuilderのメインウィンドウのデリゲートとしてappControllerを設定し、appControllerに-windowWillResize:メソッドを実装する必要があります。

フランス語に精通している場合は、この件について書いたブログエントリ(Délégation en Cocoa)をご覧ください。

+0

Grahamとmouvicielの両方に感謝します。 NSWindowの作成が間違っていると思われました。 私が知らなかったことは、windowWillResizeが組み込み関数だということでした。 これは私の次の質問です。インターフェースビルダーを使用しなかった場合、私のコードには、appControllerをMainWindowのデリゲートにしたいと思っていますか? – hahuang65

+0

ああ待って、今私は混乱している...どのようにwindowWillResizeは、メインウィンドウを制御する知っている?ヘッダーファイルで宣言しましたが、メインウィンドウにはどこにも接続しません。私はデリゲートとしてappControllerを設定します... windowWillResize関数はどのように実際のサイズ変更にリンクしますか? – hahuang65

+0

インターフェイスビルダーでappControllerをデリゲートとして設定すると、-windowWillResizeをメインウィンドウに接続することができます。ユーザーがメインウィンドウのサイズ変更を要求すると、ウィンドウインスタンスは[delegate windowWillResize:...]というメッセージをdelegate = appControllerのどこに送信します。 – mouviciel

2

NSWindowのインスタンスがリークしています。 -initでは、NSWindowインスタンスを作成します。ただし、NIBがロードされるとInterface Builderで指定したすべての接続が設定され、代わりにNIBからウィンドウを使用し始めるため、これは使用されません。コードでウィンドウオブジェクトを作成しないでください - Interface Builderはあなたのためにそれを行います! :-)

実際、「代わりに」ではありません。あなたのアプリケーションコントローラはの代理人になりました。NSWindowインスタンス - NIBからのものと、-initでインスタンス化したものです。しかし、コード内のNSWindowは決して他の場所では使用されないため、それはまだ冗長であり、削除する必要があります。

1

あなたがちょうどあなたがこれらの2つのNSWindowの方法のいずれかを使用することができ、ウィンドウの縦横比を維持したい場合:

  • setAspectRatio:(NSSize)
  • setContentAspectRatio:(NSSize)

第1の方法はウィンドウ全体をロックタイトルバーを含むサイズ。 2番目はコンテンツだけです。デリゲート内のウィンドウの初期化中にこのメソッドを呼び出すことができます(例:-applicationDidFinishLaunching

関連する問題