Как сфокусироваться на NSWindow, загруженном из NIB?

Я использую NSWindowController для загрузки окна из NIB. Однако, когда я вызываю showWindow:, окно визуально находится наверху, но фокус остается там, где он был (вместо того, чтобы перемещать его в новое окно).

Это легко увидеть, когда первое окно (с фокусом клавиатуры) немного сдвинуто перед созданием нового окна (с помощью cmd + n). Это результат:

Нижнее сфокусированное окно является исходным окном. Несфокусированное окно вверху - это вновь созданное окно.

Это соответствующий код:

AppDelegate.h:

- (IBAction)newDocument:(id) sender;

AppDelegate.m:

- (IBAction)newDocument:(id) sender {
    [[[FooController alloc] init] showWindow:self];
}
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
    [self newDocument:self];
}

FooController.h:

@interface FooController : NSWindowController { }
@end

FooController.m:

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

FooWindow.xib:
Недавно созданный Window xib без изменений.

MainMenu.xib:
MainMenu.xib по умолчанию с удаленным окном.

Вызов makeKeyAndOrderFront: в окне в методе windowDidLoad контроллера, похоже, не фокусирует новое окно. Установка владельца файла FooWindow.xib на FooController также не помогла.

Как правильно загрузить и отобразить окно из NIB, чтобы оно получало фокус клавиатуры?

Изменить: похоже, что метод NSWindowController window возвращает nil, что объясняет, почему вызов методов на window ничего не делает. Но почему это nil?


person Zr40    schedule 13.03.2011    source источник


Ответы (2)


Хорошо, я нашел причину этой проблемы.

Владелец файла xib должен быть установлен на контроллер, и (это та часть, о которой я не знал) вы должны подключить выход window контроллера к самому окну.

После этого он просто работает. Никаких makeKeyWindow, makeMainWindow или makeKeyAndOrderFront: не требуется.

person Zr40    schedule 13.03.2011

Возможно, makeMainWindow: или makeKeyWindow: поможет

person lbrndnr    schedule 13.03.2011
comment
Вызов их из windowDidLoad не фокусирует новое окно. Может быть, их следует вызывать откуда-нибудь? - person Zr40; 13.03.2011
comment
Я думаю, их следует вызывать после вызова makeKeyAndOrderFront: - person lbrndnr; 13.03.2011
comment
Это то, что я пробовал раньше. Какую бы комбинацию и порядок makeKeyAndOrderFront:, makeMainWindow и makeKeyWindow я не вставил windowDidLoad, новое окно не получает фокуса. - person Zr40; 13.03.2011