Текстовое поле какао, возвращающее ноль - PullRequest
0 голосов
/ 09 августа 2011

Извините, если это немного длинно, но я хочу быть как можно более информативным. Я делаю тестовое приложение с несколькими классами и двумя файлами перьев (каждый класс является владельцем одного кончика). В одном из файлов пера есть текстовое поле, в другом - кнопка. Я пытаюсь записать все, что находится внутри текстового поля, когда нажата кнопка в другом виде пера, но она возвращает (ноль). В одном из классов (ViewClass) у меня есть это:

- (IBAction)startAction:(id)sender {
MyClass *anInstance = [[MyClass alloc] init];
NSString *string= [anInstance name];
NSLog(@"startAction logged: %@", string);

«Имя» является собственностью MyClass. То, что я хочу сделать, это установить «имя» в инициализации MyClass, таким образом, когда инициализируется anInstance, метод инициализации MyClass делает это:

- (id)init {
if ( self = [super init] )   {
    [self setName:[nameInput stringValue]];
    NSLog(@"init value: %@", name);
}
return self;

«NameInput» - это текстовое поле. Я думал , что вернулось бы все, что было в текстовом поле, но вместо этого я получил ноль Когда я использую setName:@"text", он проходит нормально, что-то не так с текстовым полем.

Ранее я делал это с моим собственным геттером, и в этом случае он не возвращал ноль, когда метод вызывался из его собственного класса, но если он был инициализирован и вызывался из другого класса, то он возвращал ноль, Я использовал это:

- (NSString *)name {
NSLog(@"nameMethod = %@", [nameInput stringValue]);
return [[[nameInput stringValue] retain] autorelease];

Таким образом, я могу сказать, что все настроено правильно, но что-то происходит, когда я запускаю MyClass из ViewClass и пытаюсь получить «name», которое постоянно говорит, что текстовое поле пустое.

Не уверен, поможет ли это, но перо с кнопкой принадлежит MyView (который является подклассом NSViewController), а текстовое поле принадлежит MyClass (подкласс NSObject).

Кто-то предположил, что поле не было должным образом связано, но если бы это было правдой, оно не сработало бы при вызове из его собственного класса, но это сработало. Кто-то еще упомянул, что это может быть проблема с инициализацией текстового поля на ноль, поэтому я попробовал вещь инициализации выше. Ни то, ни другое не сработало.

Спасибо за помощь.

Ответы [ 2 ]

5 голосов
/ 09 августа 2011

IBOutlets не гарантированно подключаются до awakeFromNib, то есть после запуска методов init ваших объектов. Вам нужно будет выполнить настройку пера в awakeFromNib.

РЕДАКТИРУЙТЕ СЕЙЧАС, ЧТО Я ПОЛУЧИЛ ДОМОЙ: Извините, я не читал достаточно внимательно, прежде чем. То, что я сказал выше, было правдой, но есть и более глубокая проблема. Теперь я вижу, что вы также имеете дело с двумя разными объектами - один в кончике, другой - в коде. Если у вас есть объект в наконечнике с выходом, подключенным к элементу интерфейса, это не заставляет другие объекты этого класса также иметь переменную экземпляра, ссылающуюся на элемент. Два независимо созданных экземпляра MyClass не совместно используют одни и те же переменные экземпляра, поскольку каждый NSArray в вашей программе содержит один и тот же набор элементов. Если вы хотите использовать экземпляр из пера, вам нужно использовать этот экземпляр.

Как вы это делаете, зависит от того, как вы структурируете свою программу. Там нет простого [self magicallyGetObjectFromNib]. Каким-то образом один объект должен либо найти другой (скажем, узнав владельца пера), либо сообщить о другом объекту, который знает о них обоих.

0 голосов
/ 09 августа 2011

Вы находитесь в процедуре инициализации, когда пытаетесь извлечь значение из поля в том же объекте и, очевидно, ожидаете, что оно будет инициализировано. 'Tain не случится.

...