2012-04-16 3 views
2

У меня есть NSStatusItem, который отображает NSPopover, который содержит NSTextField, но текстовое поле не редактируется, хотя это так было в Xcode. Теперь это известная ошибка, и есть, по-видимому, решение, которое кто-то разместил here. Мне действительно нужно обойти эту ошибку.NSStatusItem с NSPopover и NSTextField

Я просто цитирую ответ здесь для удобства:

Основной проблемой является то, как события клавиатуры работает. Хотя NSTextField (и все его супервизоры) получает события клавиатуры, он не предпринимает никаких действий. Это происходит потому, что представление, в котором находится popover, находится в окне, которое не может стать ключевым окном. Вы не можете получить доступ к этому окну никоим образом, по крайней мере, я не мог. Таким образом, решение переопределяет метод canBecomeKeyWindow для каждого NSWindow в нашем приложении с использованием категории.

NSWindow+canBecomeKeyWindow.h 
@interface NSWindow (canBecomeKeyWindow) 

@end 

NSWindow+canBecomeKeyWindow.m 
@implementation NSWindow (canBecomeKeyWindow) 

//This is to fix a bug with 10.7 where an NSPopover with a text field cannot be edited if its parent window won't become key 
//The pragma statements disable the corresponding warning for overriding an already-implemented method 
#pragma clang diagnostic push 
#pragma clang diagnostic ignored "-Wobjc-protocol-method-implementation" 
- (BOOL)canBecomeKeyWindow 
{ 
    return YES; 
} 
#pragma clang diagnostic pop 

@end 

Это делает поповер полностью resposive. Если вам нужно другое окно, которое должно отвечать NO на canBecomeKeyWindow, вы всегда можете сделать подкласс.

Я действительно не понимаю, что я должен делать. Я просто создаю эти два файла NSWindow + canBecomeKeyWindow (.h и .m), и это будет делать это? Потому что это не работает для меня.

Я не уверен в этом, но это работает, только если я использую NSWindow, который отображает NSPopover? Я не использую NSWindow, как я могу получить NSTextField для редактирования?

Спасибо.

ответ

3

Да, просто добавьте файлы NSWindow + canBecomeKeyWindow (.h и .m) в свой проект, и он должен работать. Я использую эту технику в приложении, которое я сейчас разрабатываю, и он отлично работает. Убедитесь, что NSWindow + canBecomeKeyWindow.m указан в разделе «Источники компиляции» на этапах сборки вашего проекта.

В стороне, у меня есть другие проблемы, использующие NSPopover, чтобы показать окно из NSStatusItem. Я на самом деле не пытался использовать его в своем проекте, но this выглядит перспективным как альтернатива.

+0

Спасибо за ответ. Надеюсь, Apple скоро это исправит. Я также искал альтернативы, но я предпочел бы полагаться на код Apple, потому что другие могут не обновлять их навсегда в будущем. – iMaddin

Смежные вопросы