2

Objective C、Project Builder、および IB は初めてなので、知識不足をお許しください...

NSView クラスの使用法を学び、理解するための簡単なプログラムを作成しようとしています。NSViewこれは、RED、GREEN、BLUE、および YELLOW というラベルの付いた 1 つのボタンと 4 つのボタンを備えた 1 つのウィンドウで構成されています。

目標は、ボタンを押して NSView を適切な色で塗りつぶすことです。コードのいくつかのバリエーションを試しましたが、結果に近づくものはないようです。現在、実行すると、ウィンドウは真っ黒な四角形 ( NSViewMyView と呼ばれる私のサブクラス/オブジェクト) と 4 つのボタンと共に表示されます。

MyView.h/.m ファイル内の MyView の初期色を正常に変更できますが、色を変更したり、コントローラー コード (AppController.h/.m と呼ばれる) から MyView を再描画したりできないようです。常にコンパイラの警告が表示されます。

インターフェイスは IB で作成され、Custom View オブジェクトは MyView サブクラスを指していました。以下にコードを添付しました。

//---------------------------
//
//  MyView.h
//

#import Cocoa/Cocoa.h

@interface MyView : NSView

int myColorChoice;

@end

//--------------------------
//
//  MyView.m
//

#import "MyView.h"

@implementation MyView

int myColorChoice = 4;

-(void) setMyColorChoice : (int) c {

    myColorChoice = c;

}

-(void) drawRect: (NSRect) rect {

    switch (myColorChoice) {

        case 1 :
        [[NSColor greenColor] set];
        break;

        case 2 :
        [[NSColor blueColor] set];
        break;

        case 3 :
        [[NSColor redColor] set];
        break;

        case 4 :
        [[NSColor yellowColor] set];
        break;
    }

    NSRectFill([self bounds]);
}

@end


//--------------------
//
//  AppController.h
//

#import <Cocoa/Cocoa.h>

@interface AppController : NSObject {

    IBOutlet id display;
}

- (IBAction)makeBlue:(id)sender;
- (IBAction)makeGreen:(id)sender;
- (IBAction)makeRed:(id)sender;
- (IBAction)makeYellow:(id)sender;

@end

//---------------------
//
//  AppController.m
//


#import "AppController.h"
#import "MyView.h"

@implementation AppController

- (IBAction)makeGreen:(id)sender {
    [MyView setMyColorChoice:1];
    [MyView setNeedsDisplay:YES];
}

- (IBAction)makeBlue:(id)sender {
    [MyView setMyColorChoice:2];
}

- (IBAction)makeRed:(id)sender {
    [MyView setMyColorChoice:3];
}

- (IBAction)makeYellow:(id)sender {
    [MyView setMyColorChoice:4];
}

@end

私は単にいくつかの基本原則に違反していると確信していますが、これについて頭を悩ませているようには見えません。MyView が不適切に設定されていることと関係があると思われます。メソッドのいずれかを呼び出そうとすると、試行したメソッドのいずれかに対してコンパイラが「MyView が応答しない可能性があります...」と表示されるためです。電話する。

注: 実験のために makeGreen メソッドを変更しただけです。それが機能したら、他の色のコードを複製します。

どんな助けでも大歓迎です!

みんなありがとう。

4

2 に答える 2

1

setMyColorChoice考慮すべきことの 1 つは、次のようにメソッドを設定することです。

-(void)setMyColorChoice:(NSColor *)newColor
{
    [newColor set];
    NSRectFill([self bounds]);
    [self setNeedsDisplay:YES];
}

drawRect次に、整数とスイッチを使用する代わりに、メソッドをクリーンアップできます。インスタンス変数を宣言する必要がないため、これが最も効率的な方法であり、メモリを節約できます。

于 2012-04-06T15:26:14.117 に答える
0

MyViewクラスでインスタンス メソッドを呼び出そうとしています。AppControllerそのクラスのインスタンスへの参照が必要です。おそらく、これを行う最善の方法はIBOutlet、IB に接続した を使用することです...それがdisplayivar である場合は、[display setColorChoice:1]; [display setNeedsDisplay:YES];などを呼び出すだけです。

于 2012-04-06T05:14:15.790 に答える