Новое NSWindow из приложения - миссия невыполнима? - PullRequest
0 голосов
/ 15 декабря 2010

ОК, что я делаю не так?
1.Создано приложение и приложение-какао какао с именем: window2AppDelegate
2.window2AppDelegate.h

#import "PrefWindowController.h"
@interface window2AppDelegate : NSObject <NSApplicationDelegate> {
    NSWindow *window;
    PrefWindowController * ctrl;
}

@property (assign) IBOutlet NSWindow *window;
- (IBAction) buttonClick:(id)sender;
- (IBAction) buttonCloseClick:(id)sender;
@end


3.в редакторе xib окно, подключенное к контроллеру окна, - устанавливается в appdelegate, нажимает кнопку для кнопок
4, создается

#import <Cocoa/Cocoa.h>
@interface PrefWindowController : NSWindowController {
@private

}
@end

#import "PrefWindowController.h"
@implementation PrefWindowController

- (id)init {
    self = [super initWithWindowNibName: @"PrefWindow"];
    return self;
}

- (void)dealloc {
    // Clean-up code here.
    [super dealloc];
}

- (void)windowDidLoad {
    [super windowDidLoad];
    // Implement this method to handle any initialization after your window controller's window has been loaded from its nib file.
}

@end


5создал новый xib-файл с именем PrefWindow window IBOutlet, подключенный к окну с его контроллера (также контроллер установлен на PrefWindowController)Я хочу видеть это окно при нажатии кнопки.
6.реализовано window2AppDelegate

#import "window2AppDelegate.h"
@implementation window2AppDelegate
@synthesize window;

- (id) init {
    if ((self = [super init])) {
        ctrl = [[PrefWindowController alloc] init];
    if ([ctrl window] == nil)
        NSLog(@"Seems the window is nil!\n");
    }
    return self;
}

- (BOOL)applicationShouldTerminateAfterLastWindowClosed:(NSApplication *)sender {
    return YES;
}

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
    // Insert code here to initialize your application
}

- (IBAction) buttonClick:(id)sender {
//    [[ctrl window] makeKeyAndOrderFront:self]; this doesn't work too :(
NSLog(@"it is here");
[ctrl showWindow:sender];
}

- (IBAction) buttonCloseClick:(id)sender {
    [window close];
}

@end


7.После того, как я собрал и запустил приложение: closebutton закрывает приложение, но нажатие кнопки - не показывает мне PrefWindow !?Почему и что я делаю не так?Не говорите мне, что показать другое окно в какао target-c сложнее, чем в "тупой" Java или C #?

Ответы [ 3 ]

1 голос
/ 15 декабря 2010

Наконец я справился с проблемой!В редакторе пера для PrefWindow мне нужно было сделать: Установить класс владельца файла: NSWindowController , а затем подключить окно IBOutlet от владельца файла к моему (предпочитанию) окну .После 6 дней неудачных попыток гугл работает.
В любом случае, спасибо за все ваши ответы и время!

0 голосов
/ 15 декабря 2010
- (id) init {
   if ((self = [super init])) {
      ctrl = [[PrefWindowController alloc] init];
   if ([ctrl window] == nil)
      NSLog(@"Seems the window is nil!\n");
   }
   return self;
}

init слишком рано в схеме вещей, чтобы пытаться протестировать IBOutlets.Они все еще будут нулевыми.Только в дальнейшем в процессе создания объекта выходы наконечника будут «подключены».Стандартный метод, при котором вы можете знать, что все в nib-файле подключено:

- (void)awakeFromNib {

}

. На этом этапе все ваши IBOutlets должны быть действительными (при условии, что они не ссылаются на объект вотдельный, еще не выгруженный перо).

Если PrefWindowController - это класс, который будет использоваться только после , пользователь выбирает «Предпочтения» из меню приложения, я бы не согласился с остальными искажем, что я не буду создавать экземпляр PrefsWindowController вообще во время начальной загрузки.(Ваш главный контроллер должен работать независимо от окна настроек).Если у вас есть метод, который предназначен для загрузки окна настроек, , а затем , когда этот метод вызывается, вам следует проверить, равен ли экземпляр PrefsWindowController nil, и если это так, создать его, а затем перейти кпоказать окно настроек.

0 голосов
/ 15 декабря 2010

Я бы посоветовал вам перенести создание PrefWindowController в applicationDidFinishLaunching:

Я не уверен, что вызывается метод init делегата приложения. Вероятно, только initWithCoder: вызывается при разархивировании объекта из NIB.

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