IBOutlets ниба не связаны (ноль) - PullRequest
2 голосов
/ 27 сентября 2011

У меня есть пользовательский класс, который должен загружать окно из nib-файла. Когда я загружаю nib-файл, все выглядит нормально, за исключением того, что IBOutlets не подключены, то есть ноль. IBActions работают нормально, и когда они называются, IBOutlets больше не равны нулю.

Класс добавляется к пиру в IB как объект и, очевидно, все подключено.

Это владелец файла и его делегат

Когда он загружает перо, окно появляется только в том случае, если установлено «видимое при запуске».

Неважно, куда я загружаю перо и пытаюсь получить доступ к IBOutlets немедленно или через несколько секунд.

Это должно быть что-то очень тривиальное ...

ОБНОВЛЕНИЕ2: Я ЗАГРУЗИЛ ДАЖЕ ПРОБНЫЙ ПРОЕКТ ПРОЕКТА: Пробный проект2

Ожидаемое поведение: заголовок Window2 меняется на «Заголовок изменился x раз» при загрузке. Он начинает работать только после нажатия кнопки, т. Е. IBOutlets больше не равны нулю.

Ответы [ 2 ]

2 голосов
/ 27 сентября 2011

Большим изменением стало создание подкласса NSWindowController для создания MyClass. Таким образом, вы пытаетесь манипулировать кнопкой закрытия только после загрузки окна. Ваш код был достаточно маленьким, поэтому я решил, что лучше просто опубликовать изменения:

trialProjectAppDelegate.m

#import "trialProjectAppDelegate.h"

@implementation trialProjectAppDelegate

@synthesize window;

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    myclass = [[MyClass alloc] init];
    // Note that I'm forcing the window to load here.
    (void) [myclass window];
}

@end

MyClass.h

#import <Cocoa/Cocoa.h>

@interface MyClass : NSWindowController
{
    IBOutlet NSButton *dismissButton;
}

- (IBAction)closeNaggingWindow:(id)sender;
- (void)disableDismissButton;

@end

MyClass.m

#import "MyClass.h"

@implementation MyClass

- (id)init
{
    if ((self = [super initWithWindowNibName:@"Window"]) != nil)
    {
    }

    return self;
}

- (void)disableDismissButton
{
    [dismissButton setEnabled:NO];
    [dismissButton setTitle:@"Closing enabled in 5 sec"];

    [self performSelector:@selector(enableDismissButton:) withObject:nil afterDelay:5];
}

- (IBAction)enableDismissButton:(id)sender
{
    [dismissButton setEnabled:YES];
    [dismissButton setTitle:@"Close"];
}

- (IBAction)closeNaggingWindow:(id)sender
{
    [[self window] close];
    [self autorelease];
}

- (void)awakeFromNib
{
    [self disableDismissButton];
}

@end

Наконец, в вашем файле Window.xib отбросьте выход naggingWindow и подключите ваше окно к выходу окна, который предоставляет NSWindowController.

1 голос
/ 28 сентября 2011

Я не работал ни с одним из классов интерфейса OS X, так что может быть какой-то аспект, который не является на 100% точным, но в основном происходит следующее:

Высвязал объект NSWindow вашего пера к объекту MyClass, который также находится в вашем пике.Поэтому, когда вы загружаете этот кончик, вот что происходит:

  • Создается экземпляр MyClass
  • Создается экземпляр NSWindow с несколькими подпредставлениями.NSWindow и кнопка присоединены к новому экземпляру MyClass.
  • Ничто не связано с псевдообъектом Владельца файла (экземпляр MyClass, созданный вами в делегате приложения)

Затем -changeWindowTitle вызывается для вашего исходного экземпляра MyClass, у которого нет подключенных ни к одному из выходов.

Решение простое: удалите объект MyClass из вашего файла пера.Выберите «Владелец файла» и в Identity Inspector (третий значок слева на панели «Утилиты») установите «Class» в «MyClass».Теперь снова подключите свои выходы к объекту «Владелец файла», который является вашим исходным экземпляром MyClass.Теперь вы должны увидеть ожидаемое поведение.

Кроме того, в методе * 1027 правильное место для того, чтобы делать вещи «как только будет загружено перо», например, задавать свойства для ваших свежих объектов IBOutlet.*.

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