Ссылка CustomView из моего контроллера - PullRequest
0 голосов
/ 10 ноября 2010

Это сводит меня с ума. Очень благодарен, если кто-то может мне помочь!

Проблема: Я создал подкласс NSView (и реализовал initWithRect: и drawRect:) и подключил его к customView в IB. Затем в моем 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 голосов
/ 10 ноября 2010

Шаги, которые вы описываете, не совсем понятны, но вот несколько вещей, которые выделяются:

1 - Вы не можете спрашивать объект об его -retainCount, чтобы определить, используется ли он или нет,У вас нет возможности узнать (и при этом вы не должны знать или зависеть от знания), что еще может иметь интерес к этому объекту.

2 - Вы проверяете действительный объект, проверяя, есть ли указатель объекта ("view "в вашем случае) является действительным (указывает на объект) или имеет значение nil.

3 - При создании пользовательского подкласса NSView и создании экземпляра копии в вашем nib / xib необходимо перетащить экземпляр NSView изиз библиотеки, затем установите его имя класса для вашего подкласса, в противном случае Interface Builder просто создает экземпляр NSView.Я не думаю, что это ваша проблема (см. № 4), но вы не сказали этого, так что это еще одна вещь, чтобы проверить.

4 - Когда вы отправляете сообщение на ноль, ничто не является точно тем, что предполагаетсяслучиться, так что, скорее всего, ваш указатель / выход "view" равен nil.

5 - Легко спутать "экземпляр, который я создал и на который есть ссылка в nib / xib", с "экземпляром, который я создал во время выполнения",Это часто случается с новичками в Какао.Вы абсолютно уверены, что экземпляр объекта, который содержит соединение (с именем «view»), совпадает с экземпляром, который вы исследуете во время выполнения?Например, вы создаете класс контроллера с именем MyController, создаете его экземпляр в своем nib / xib (как синий куб), подключаете его и т. Д. Затем во время выполнения вы создаете новый MyController ([[MyController alloc] init] ...) и попытался получить доступ к его (nil) выходу «view», который ни на что не указывает, потому что это не тот же экземпляр, что и в вашем nib / xib.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...