从我的Controller引用CustomView

时间:2010-11-10 20:07:22

标签: objective-c xcode interface-builder

这让我发疯了。非常感谢有人能帮助我!

问题: 我已经将NSView子类化(并实现了initWithRect:drawRect:)并将其连接到IB中的customView。然后在我的Controller.h中,我尝试使用Viewer *view;创建对此实例的引用(Viewer是我的NSView的子类)。但是,当我尝试达到只执行printf("something")的虚拟函数时,没有任何反应。因为我没有为这个实例分配任何内存[view retainCount]给出0.我的理解是IB会为我实例化这个类。我希望能够引用该实例的原因是我可以调用[view setNeedsDisplay: YES]以便重新绘制视图。我已将我的CustomView连接到IB中的视图插座并保存。

#import "Viewer.h"
#import "Controller.h"


@implementation Viewer

- (id)initWithFrame:(NSRect)frameRect
{
    self = [super initWithFrame:frameRect];
    return self;
}

-(void)awakeFromNib 
{
    printf("awake!\n"); //works!
}   

- (void)drawRect:(NSRect)rect
{
    CGContextRef myContext = [[NSGraphicsContext currentContext]graphicsPort];
    for (int i=0; i<8; i++) {
        for (int j=0; j<8; j++) {
            printf("%f\n",gPopulation[i][j]/2);
            CGContextSetRGBFillColor (myContext, gPopulation[i][j]/2, 0.3, 0.1, 1); // Set color
            CGContextFillRect (myContext, CGRectMake (i*50, j*50, 50, 50 ));
        }
    }
}


**- (void) redraw { //dummy function that I can't reach from controller with [view redraw]. Gives no error, but retainCount = 0**
    printf("redraw------\n");
    //[self display];
}

@end

#import <Cocoa/Cocoa.h>
#import "Viewer.h"

double gPopulation[8][8];

@interface Controller : NSObject {
    NSMutableArray *emptySpots; 
    int nEmpty, nWhite, nBlack;
    NSOperationQueue *queue; 
    IBOutlet Viewer *view;
}
- (void) main;
- (id) initWithMain;
- (void) updatePopulation;
- (void) initPopulation;
@end

1 个答案:

答案 0 :(得分:0)

您描述的步骤并不完全清楚,但有以下几点是突出的:

1 - 您不能向对象询问其-retainCount来确定它是否被使用。你无法知道(你也不应该知道或依赖于知道)还有什么可能对这个目标感兴趣。

2 - 通过查看对象指针(在您的情况下为“view”)是否有效(指向对象)或是否为零来检查有效对象。

3 - 在创建自定义NSView子类并在nib / xib中实例化副本时,需要从库中拖出NSView实例,然后将其类名设置为子类的名称,否则Interface Builder只是创建NSView的一个实例。我不认为这是你的问题(见#4),但你没有这么说,所以检查是另一回事。

4 - 当你向nil发送消息时,没有什么是应该发生的,所以你的“视图”指针/出口可能是零。

5 - 很容易将“我在nib / xib中创建和引用的实例”与“我在运行时创建的实例”混淆。这对Cocoa新手来说经常发生。您是否绝对肯定持有连接的对象(名为“view”)的实例与您在运行时检查的实例相同?例如,您创建一个名为MyController的控制器类,在您的nib / xib中实例化(作为蓝色立方体),连接它等等。然后在运行时,您实例化一个新的MyController([[MyController alloc] init] .. 。)并试图访问它的(零)“视图”插座,它指向什么都没有,因为它与你的nib / xib中的实例不同。