#objective-c #cocoa
#objective-c #какао
Вопрос:
У меня есть пользовательский NSButton, который я фактически вставляю в NSStatusItem. При нажатии кнопки NSButton запускается мое окно. При повторном нажатии кнопки NSButton окно должно закрыться.
Если окно открыто, кажется, что NSButton перестает отвечать (или не получает) события щелчка! Вот соответствующий код:
[statusItem setView:myCustomButton];
[myCustomButton setAction:@selector(showWindow:)];
- (void)showWindow:(id)sender {
if(!myWindowController) {
myWindowController = [[MyWindowController alloc] initWithWindowNibName:@"MyWindow"];
}
[myWindowController showWindow:statusItem];
[myWindowController.window orderFront:nil];
}
Я делаю что-то сумасшедшее? Если я установлю точку останова в приведенном выше примере, она будет нажата при первом нажатии кнопки, но не будет нажата при повторном нажатии кнопки.
Ответ №1:
Я предполагаю, что вы не устанавливаете цель на кнопке. Если кнопка имеет действие, но не имеет цели, она отправляется вверх по цепочке ответчиков. Когда отображается новое окно, вероятно, изменяется цепочка ответчиков, что означает, что ваше действие отправляется в другое место.
tl; dr: попробуйте установить цель на кнопке.
Комментарии:
1. Это звучит правдоподобно. -ShowWindow: реализован на NSWindowController, поэтому каждое окно с оконным контроллером может перехватить это сообщение. Но поскольку окно, содержащее кнопку, всегда является самым передним окном при нажатии на эту кнопку, его оконный контроллер всегда должен перехватывать сообщение. На самом деле, поскольку в этом методе выделяется оконный контроллер, этот оконный контроллер заканчивает перехватывать сообщение, поэтому он всегда показывает окно. Измените сигнатуру метода на что-то вроде «toggleWindow:» и посмотрите, что произойдет.
2. Для будущих пользователей Google я решил добавить, что у меня возникла проблема с тем, что мои IBActions не вызывались. Это было вызвано тем, что весь мой контроллер представления равен нулю, поскольку я не сохранил его в свойстве после его передачи
window.beginSheet
.