NSView无法在一个非常简单的程序中响应

时间:2012-04-06 03:22:13

标签: xcode cocoa nsview

Objective C,Project Builder和IB的新手,请原谅我缺乏知识......

我正在尝试创建一个简单的程序来学习和理解NSView类的使用。它由一个带有单个NSView的窗口和四个标记为RED,GREEN,BLUE和YELLOW的按钮组成。

目标是按下按钮并使NSView填充适当的颜色。我尝试了几种代码变体,但似乎没有任何更接近结果。目前,执行时,窗口显示一个纯黑色方块(我的NSView子类/对象MyView)和四个按钮。

我可以在MyView.h / .m文件中成功更改MyView的初始颜色,但是,我似乎无法更改颜色或从我的控制器代码重写MyView(称为AppController.h / .m) 。我总是收到编译器警告。

接口在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方法进行实验。一旦有效,我将复制其他颜色的代码。

非常感谢任何帮助!

谢谢你们。

2 个答案:

答案 0 :(得分:1)

要考虑的一件事是设置这样的setMyColorChoice方法:

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

然后,您可以清除drawRect方法,而不是使用整数和开关。这是最有效的方法,因为您不需要声明实例变量,从而节省内存。

答案 1 :(得分:0)

您正在尝试在MyView类上调用实例方法。您的AppController需要对该类实例的引用。可能最好的方法是使用IBOutlet你已经联系到IB ...如果这是你的display ivar,那么你需要做的就是致电{{1}等等。