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方法进行实验。一旦有效,我将复制其他颜色的代码。
非常感谢任何帮助!
谢谢你们。
答案 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}等等。