Свойства NULL внутри обработчика событий (приложение какао) - PullRequest
0 голосов
/ 01 декабря 2011

У меня есть класс с несколькими IBOtlets:

@interface MainDreamer : NSWindow <NSWindowDelegate>
{    
    IBOutlet NSTextField *dreamField;
    IBOutlet NSTableView *dreamTable;    
    IBOutlet NSImageView *dreamview;

    IBOutlet NSMutableArray *dreamlist;  
    IBOutlet NSMutableArray *dataset;
}

Все в порядке, но только в обработчике события mouseUp:

- (void) mouseUp:(NSEvent *)theEvent{
    [super mouseUp:theEvent];
    long index = [dreamTable selectedRow];
    Dream *dr = [dataset objectAtIndex:index];
    dr.dreampicture = dreamview.image;
    [dataset replaceObjectAtIndex:index withObject:dr];
}

все они превращаются в NULL.

Как получить доступ к IBOutlets внутри обработчика событий?

Ответы [ 2 ]

1 голос
/ 01 декабря 2011

Как получить доступ к IBOutlets внутри обработчика событий?

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

Так почему же ваши розетки подключены в одних частях вашего кода и удерживают nil в других?

Обычно это происходит потому, что вы создали объект MainDreamer в nib и создали его в коде, или вы создали его в двух отдельных nib.

В любом случае, это делает два объекта одного класса. Это не один и тот же объект, и у одного из них есть выходы, а у другого нет. Тот, на который вы нажимаете, не тот, который вы создали и подключили в наконечнике (или в одном из наконечников).

Способ доказать это можно было бы зарегистрировать self как в методе mouseUp:, так и в любом месте, где вы обнаружили розетки для подключения. Я ожидаю, что вы найдете разные значения self: как я уже сказал, два объекта.

Решение состоит в том, чтобы удалить один из экземпляров и изменить его использование, чтобы использовать другой. Если вы создаете один из объектов в коде, это тот, который вы должны удалить, вместо того, чтобы в перо.

0 голосов
/ 01 декабря 2011

Если mouseUp является методом в вашем объекте MainDreamer, свойства должны быть доступны. Вы уверены, что правильно подключили все розетки в Интерфейсном Разработчике? Попробуйте добавить это к вашему объекту:

- (void)awakeFromNib {
    NSLog("table: %@", dreamTable);
    NSLog("view: %@", dreamview);
    NSLog("dataset: %@", dataset);
}

Если они null, значит, они неправильно подключены.

...