Установить значение NSTextField - PullRequest
3 голосов
/ 14 мая 2011

Я пытаюсь установить значение NSTextField, но оно не работает должным образом.

У меня есть кнопка, связанная с IBAction, и когда я устанавливаю ее с помощью self, онаотлично работает:

#import <Foundation/Foundation.h>


@interface TestMessage : NSObject {
     IBOutlet NSTextField *text;
}

- (IBAction) setMessage: (id) controller;
- (void) Message:(NSString *) myMessage;    
@end

#import "TestMessage.h"

@implementation TestMessage

- (IBAction) setMessage: (id) controller {
    // This works
    [self Message:@"Hello"];

    // but this doesn't
    TestMessage * messageTest= [TestMessage new];
    [messageTest Message:@"Hi"];

}
- (void) Message: (NSString *) myMessage {
    [text setStringValue: myMessage]; 
    NSLog(@"Message Was Called");
    // This returns <NSTextField: 0x1001355b0> when called 
    // using self, but null when called the other way.
    NSLog(@"%@", text);
}

@end

Я искал некоторое время, но все еще не могу найти ответ.

Я думаю, это как-то связано сделегат, но я не уверен.

Заранее спасибо.

Ответы [ 3 ]

1 голос
/ 14 мая 2011

Вы уверены, что сообщение вызывается, когда вы звоните с anotherFuntion? Если anotherFuntion является методом другого класса, вызов [self message:] не будет работать так, как вы ожидали ...

0 голосов
/ 01 мая 2015

Код

TestMessage * messageTest = [TestMessage new];

необычен, в частности new.Я собираюсь предположить, что new это просто метод класса, который обычно alloc / init эквивалентен

 TestMessage * messageTest = [[TestMessage alloc] init];

Основная проблема заключается в том, что IBOutlet NSTextField *text будет инициализирован, только если классTestMessage загружается с файлом Nib.Он должен быть назван как класс объекта в Интерфейсном Разработчике, например,

Set to load this class in IB

, и вам нужно будет реализовать initWithCoder и encodeWithCoder примерно так вЧтобы извлечь значение вашего поля из кодировки IB:

- (instancetype)initWithCoder:(NSCoder *)coder {
    self = [super initWithCoder:coder];
    if (self) {
        self.text = [coder decodeObjectForKey:@"text"];
    }
    return self;
}


-(void)encodeWithCoder:(NSCoder *)coder
{
    [super encodeWithCoder:coder];
    [coder encodeObject:self.text forKey:@"text"];
}

По сути, поля IBOutlet не подключаются при создании экземпляра этого класса.Если бы они это сделали, как бы вы выразили, что поле A должно быть связано с объектом A интерфейса A, а поле B должно быть связано с объектом B интерфейса U?Соединение устанавливается только в контексте загрузки класса из файла Nib.

0 голосов
/ 23 января 2013

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

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