这让我发疯了。非常感谢有人能帮助我!
问题:
我已经将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
答案 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中的实例不同。