Значение установлено в NSTextField игнорируется - PullRequest
0 голосов
/ 26 февраля 2012

У меня есть класс RandomGenerator:

// RandomGenerator.h
#import <Foundation/Foundation.h>
@interface RandomGenerator : NSObject 
{
    @private
    IBOutlet NSTextField* textField;
    unsigned int number;
}
@end

//RandomGenerator.m
#import "RandomGenerator.h"
@implementation RandomGenerator

- (id)init
{
    self = [super init];
    if (self) 
    {
        textField=[[NSTextField alloc]init];
        [textField setStringValue:@"Insert a number between 1 and 100"];
        srand((unsigned int)time(NULL));
    }
    return self;
}
- (void)dealloc
{
    [super dealloc];
}
@end

Что при построении он автоматически устанавливает значение NSTextField. Я выделяю объект RandomGenerator из файла GuessTheNumberAppDelegate.m:

#import "GuessTheNumberAppDelegate.h"
#import "RandomGenerator.h"
@implementation GuessTheNumberAppDelegate
@synthesize window;
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    NSAutoreleasePool* pool=[[NSAutoreleasePool alloc]init];
    RandomGenerator* random=[[RandomGenerator alloc]init];
    [pool drain];
}
@end

И я установил соединения в конструкторе интерфейсов:

Connection

Interface builder screen

Но содержимое NSTextField не изменяется, оно выглядит так же, почему это?

Result

Ответы [ 2 ]

1 голос
/ 27 февраля 2012

Я согласен с Джошем, особенно в части awakeFromNib.Ниже приведено несколько дополнительных заметок / тестов, которые я написал для проверки.Ниже приведены файлы RandomGenerator, но они упрощены, чтобы проиллюстрировать то, о чем я думал, о чем ваш вопрос:

//  RandomGenerator.h
#import <Foundation/Foundation.h>
@interface RandomGenerator : NSObject {
    IBOutlet NSTextField *textField;
}
@end
--------------
//  RandomGenerator.m
#import "RandomGenerator.h"
@implementation RandomGenerator
- (void)awakeFromNib {
    [textField setStringValue:@"Insert a number between 1 and 100"];
}
@end

А затем файлы AppDelegate:

//  GuessTheNumberAppDelegate.h
#import <Cocoa/Cocoa.h>
@interface GuessTheNumberAppDelegate : NSObject <NSApplicationDelegate> 
@property (assign) IBOutlet NSWindow *window;
@end
--------------
//  GuessTheNumberAppDelegate.m
#import "GuessTheNumberAppDelegate.h"
#import "RandomGenerator.h"
@implementation GuessTheNumberAppDelegate
@synthesize window = _window;
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
    RandomGenerator *random = [[RandomGenerator alloc] init];
    NSLog(@"%@",random);
}
@end

Сборка и запуск проекта Я получаю то, чтоможно ожидать:

enter image description here

с

enter image description here

Обратите внимание, что мне не нужно было подключать RandomGenerator в качестве IBOutlet, япросто убедился, что его заголовок включен в файл GuessTheNumberAppDelegate.h.Но имейте в виду, что у Джоша может быть что-то более общее, поэтому вам, возможно, все равно придется это сделать.

Надеюсь, это поможет!

1 голос
/ 27 февраля 2012

В -[RandomGenerator init] вы создаете новый объект текстового поля, который не имеет отношения к текстовому полю, которое уже находится в вашем файле xib, и указываете выход на этот новый объект. Объекты в xib - это реальные, реальные объекты, которые выделены для вас механизмом загрузки. Вам не нужно textField = [[NSTextField alloc] init];, * и не нужно RandomGenerator* random=[[RandomGenerator alloc]init];. Оба этих объекта уже существуют в вашей xib.

Однако вам нужно изменить несколько вещей. Во-первых, если вы хотите, чтобы делегат вашего приложения имел доступ к RandomGenerator, вам нужно дать ему выход и подключить его: IBOutlet RandomGenerator * generator;. Во-вторых, вам нужно переместить [textField setStringValue:@"Insert a number between 1 and 100"]; из из -[RandomGenerator init]. Из-за способа загрузки пера метод init генератора будет вызываться до того, как текстовое поле будет подключено IBOutlet, и, возможно, до того, как текстовое поле будет даже создано.

Я почти уверен, что если вы добавите:

- (void)awakeFromNib {
    [textField setStringValue:@"Insert a number between 1 and 100"];
}

до RandomGenerator, это поможет. После загрузки пера и воссоздания всех объектов в нем awakeFromNib следует отправить всем этим объектам.


* и это не правильный инициализатор для NSTextField в любом случае

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