Какао: загрузить NSViewController с пером

Я попробовал много возможностей, которые нашел на этом сайте, и прочитал некоторые объяснения со страницы разработчика Apple, но, похоже, я не смог решить свою проблему с загрузкой NSViewController с помощью / form NIB.

Файлы в Xcode Project выглядят примерно так:

  • SecondViewController.h
  • SecondViewController.m
  • SecondViewController.xib
  • AppDelegate.h
  • AppDelegate.m
  • MainMenu.xib

Основная проблема заключается в том, как я могу программно создать SecondViewController с начальным пером на SecondViewController.xib

  • Пользовательский класс FileOwner на MainMenu.xib - NSApplication
  • Пользовательский класс FileOwner на SecondViewController.xib - SecondViewController
  • В MainMenu.xb есть несколько панелей и окон (об окне и панели настроек)
  • У этого приложения нет главного окна (с помощью значка уведомления в строке состояния)

SecondViewController.h

@interface SecondViewController : NSViewController {
    BOOL fullScreenMode;
    NSImageView *fullScreenbg;
    NSImageView *imageView1;
    NSImageView *imageView2;
    NSPanel *imageWindow;

}


@property (assign) IBOutlet NSImageView *fullScreenbg;
@property (assign) IBOutlet NSImageView *imageView1;
@property (assign) IBOutlet NSImageView *imageView2;
@property (assign) IBOutlet NSPanel *imageWindow;

SecondViewController.m

@implementation SecondViewController {
    NSImageView *nv1;
    NSImageView *nv2;
    NSSize curImgSize;
}

@synthesize fullScreenbg;
@synthesize imageView1;
@synthesize imageView2;
@synthesize imageWindow;

......

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Initialization code here.
        fullScreenMode = YES;
    }

    return self;
}

AppDelegate.h

@interface AppDelegate : NSObject <NSApplicationDelegate,NSWindowDelegate> {
   NSPanel *aboutWindow;
   IBOutlet NSMenu *myStatusMenu;
   IBOutlet NSMenuItem *toggleFullScreen;
}

AppDelegate.m

@implementation AppDelegate {
    SecondViewController *controller;
}

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
    controller = [[SecondViewController alloc] 
                 initWithNibName:@"SecondViewController" 
                 bundle:nil];  
    //Not work (fullscreenbg, imageView1, imageView2,imageWindow = nil)

    //controller = [[SecondViewController alloc] init]; ?? <-- didn't work either
}

Даже если вы используете initWithNibName или просто init, все свойства IBOutlet кажутся нулевыми при отладке.

я пробовал другие решения, такие как "NSBundle loadNibNamed" или с использованием loadView но это не сработало (предупреждающее сообщение: «NSObject мой не отвечает на loadView»).

Основное назначение secondViewController - отображать уведомление, включая графику и веб-элемент.

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


person theodorusap    schedule 15.09.2012    source источник
comment
Установите точку останова во время инициализации NSViewController и посмотрите, действительно ли вы инициализируете его или нет.   -  person TheAmateurProgrammer    schedule 15.09.2012
comment
Конечно. Выполняется инициализация appdelegate, выполняется initwithnibname на втором контроллере, контроллер не равен нулю / нулю, но все выходы контроллера равны нулю / нулю.   -  person theodorusap    schedule 15.09.2012
comment
Только розетки? Вы вручную настраиваете розетки? Если да, попробуйте вместо этого установить их в awakeFromNib.   -  person TheAmateurProgrammer    schedule 15.09.2012
comment
Я понял, добавьте [NSBundle loadNibNamed: @SecondViewController owner: self]; перед строкой [super initWithNibName .......]   -  person theodorusap    schedule 15.09.2012


Ответы (2)


Это нормальное поведение. IBOutlets не подключаются в конструкторе.

Вы можете переопределить viewDidLoad, вызвать super, а затем выполнить любую инициализацию.

person Rengers    schedule 16.09.2012

person    schedule
comment
Вы можете отметить свой собственный ответ как правильный, что также даст вам 15 повторений. - person TheAmateurProgrammer; 15.09.2012