Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xcode NSView无法在非常简单的程序中响应_Xcode_Cocoa_Nsview - Fatal编程技术网

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

Xcode NSView无法在非常简单的程序中响应,xcode,cocoa,nsview,Xcode,Cocoa,Nsview,新的目标C,项目建设者和IB,所以请原谅我的知识缺乏 我试图创建一个简单的程序来学习和理解NSView类的使用。它由一个带有单个NSView的窗口和四个标记为红色、绿色、蓝色和黄色的按钮组成 目标是按下一个按钮,让NSView填充适当的颜色。我尝试了代码的几个变体,但似乎没有一个更接近结果。当前,在执行时,窗口显示一个实心的黑色正方形(myNSView称为MyView的子类/对象)和四个按钮 我可以在MyView.h/.m文件中成功更改MyView的初始颜色,但是,我似乎无法更改颜色或从控制器代

新的目标C,项目建设者和IB,所以请原谅我的知识缺乏

我试图创建一个简单的程序来学习和理解NSView类的使用。它由一个带有单个
NSView
的窗口和四个标记为红色、绿色、蓝色和黄色的按钮组成

目标是按下一个按钮,让NSView填充适当的颜色。我尝试了代码的几个变体,但似乎没有一个更接近结果。当前,在执行时,窗口显示一个实心的黑色正方形(my
NSView
称为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中执行此操作。您是正确的。这就是我设置的显示。我刚做了那个改变,突然间它起了作用。。(毫不奇怪)。奇怪的是,我发誓我早就这么做了,但没用。我必须有这个代码的多个问题,并设法修复一些,而“取消”其他。谢谢你的解释。我已经纠正了这些错误,现在一切都按照我预期的方式运行,现在对我犯错误的地方有了更好的理解。