Xcode NSView无法在非常简单的程序中响应
新的目标C,项目建设者和IB,所以请原谅我的知识缺乏 我试图创建一个简单的程序来学习和理解NSView类的使用。它由一个带有单个Xcode NSView无法在非常简单的程序中响应,xcode,cocoa,nsview,Xcode,Cocoa,Nsview,新的目标C,项目建设者和IB,所以请原谅我的知识缺乏 我试图创建一个简单的程序来学习和理解NSView类的使用。它由一个带有单个NSView的窗口和四个标记为红色、绿色、蓝色和黄色的按钮组成 目标是按下一个按钮,让NSView填充适当的颜色。我尝试了代码的几个变体,但似乎没有一个更接近结果。当前,在执行时,窗口显示一个实心的黑色正方形(myNSView称为MyView的子类/对象)和四个按钮 我可以在MyView.h/.m文件中成功更改MyView的初始颜色,但是,我似乎无法更改颜色或从控制器代
NSView
的窗口和四个标记为红色、绿色、蓝色和黄色的按钮组成
目标是按下一个按钮,让NSView填充适当的颜色。我尝试了代码的几个变体,但似乎没有一个更接近结果。当前,在执行时,窗口显示一个实心的黑色正方形(myNSView
称为MyView的子类/对象)和四个按钮
我可以在MyView.h/.m文件中成功更改MyView的初始颜色,但是,我似乎无法更改颜色或从控制器代码(称为AppController.h/.m)中重新绘制MyView。我总是收到编译器警告
接口是在IB中创建的,自定义视图对象指向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.h
//
#进口可可/Cocoa.h
@接口MyView:NSView
int-mycolor选择;
@结束
//--------------------------
//
//MyView.m
//
#导入“MyView.h”
@实现MyView
int=4;
-(void)setMyColorChoice:(int)c{
myColorChoice=c;
}
-(void)drawRect:(NSRect)rect{
开关(可选){
案例1:
[[NSColor greenColor]集];
打破
案例2:
[[NSColor blueColor]set];
打破
案例3:
[[NSColor redColor]set];
打破
案例4:
[[NSColor yellowColor]set];
打破
}
NSRectFill([self-bounds]);
}
@结束
//--------------------
//
//AppController.h
//
#进口
@接口AppController:NSObject{
IBID显示;
}
-(iAction)makeBlue:(id)发送方;
-(iAction)makeGreen:(id)发送方;
-(iAction)生成:(id)发送方;
-(iAction)makeYellow:(id)发送方;
@结束
//---------------------
//
//AppController.m
//
#导入“AppController.h”
#导入“MyView.h”
@应用控制器的实现
-(iAction)makeGreen:(id)发送方{
[MyView设置颜色选择:1];
[我的视图设置需要显示:是];
}
-(iAction)makeBlue:(id)发送方{
[MyView设置颜色选择:2];
}
-(iAction)已生成:(id)发件人{
[MyView设置颜色选择:3];
}
-(iAction)makeYellow:(id)发送方{
[MyView设置颜色选择:4];
}
@结束
我很有信心,我只是违反了一些基本原则,但我似乎无法对这一点保持清醒的头脑。我怀疑这一定与MyView设置不正确有关,好像我试图调用我的任何方法一样,对于我尝试调用的任何方法,编译器都会给我“MyView可能不响应…”
注意:我只是为了实验修改了makeGreen方法。一旦成功,我将复制其他颜色的代码
任何帮助都将不胜感激
谢谢大家。您正在尝试调用
MyView
类上的实例方法。您的AppController
需要引用该类的实例。可能最好的方法是使用您在IB中连接的IBOutlet
。。。如果这就是您的display
ivar,那么您所需要做的就是调用[display setColorChoice:1];[显示设置需要显示:是]代码>等< P> >要考虑的是设置你的<代码> SETMyCopule> 这样的方法:
-(void)setMyColorChoice:(NSColor *)newColor
{
[newColor set];
NSRectFill([self bounds]);
[self setNeedsDisplay:YES];
}
然后可以清理drawRect
方法,而不是使用整数和开关。这将是最有效的方法,因为您不需要声明实例变量,从而节省内存。此外,您还没有声明实例变量myColorChoice
,您已经声明了文件范围变量。然后,您在实现文件中重新声明了它。在接口中,用大括号将实例变量声明括起来@interface MyView{int myColorChoice;}…
。不要(重新)在实现中声明变量。如果希望将实例变量初始化为某个值,请在init方法中执行该操作。(对于以编程方式创建的视图,这是initWithFrame:。对于从NIB加载的视图,这是-initWithCoder:)或者,您可以在-awakeFromNib中执行此操作。您是正确的。这就是我设置的显示。我刚做了那个改变,突然间它起了作用。。(毫不奇怪)。奇怪的是,我发誓我早就这么做了,但没用。我必须有这个代码的多个问题,并设法修复一些,而“取消”其他。谢谢你的解释。我已经纠正了这些错误,现在一切都按照我预期的方式运行,现在对我犯错误的地方有了更好的理解。