У меня есть панель XIB, которая принадлежит классу FooController.FooController также имеет выходы для кнопок «Отмена» и «Продолжить» на панели.
Позже я решил переработать эту панель для использования в процедуре завершения работы делегата приложения.Когда я назначил селекторам кнопки, я обнаружил, что кнопка «Приступить / Сохранить» и программно добавленная кнопка «DontSave» могут принимать в качестве методов селектора методы, определенные в классе делегата приложения.Но кнопка «Отмена» вызовет ошибки «нераспознанный селектор», если только его селектор не был определен в классе владельца, FooController.
Хорошо, что кажется логичным.Чтобы быть последовательным, я также установил селекторы Proceed / Save и DontSave в классе FooController.Но тогда они будут генерировать ошибки «нераспознанного селектора».
Таким образом, для кнопки отмены требуется , чтобы ее селектор находился в классе FooController.Кнопки Proceed / Save и DontSave требуют, чтобы их селекторы находились в классе appDelegate.Но все три кнопки явно принадлежат FooController;как вы можете видеть в приведенном ниже коде, даже добавленная кнопка DontSave явно назначена для contentView панели, принадлежащей FooController:
- (void) adviseOfPendingChangesBeforeQuit {
// Open the panel.
[NSBundle loadNibNamed:@"panelConfirmation" owner:self.fooController];
// Add an extra "Don't Save" button.
NSButton *btnDontSave = [[NSButton alloc] initWithFrame:NSMakeRect(12.0f, 12.0f, 106.0f, 32.0f)];
[btnDontSave setTitle:NSLocalizedString(@"Don't Save", @"Don't Save")];
[btnDontSave setButtonType:NSMomentaryPushInButton];
[btnDontSave setBezelStyle:NSRoundedBezelStyle];
[btnDontSave setAction:@selector(dumpChangesAndQuitPerPendingConfirmPanel)]; // method defined in this, the appDelegate class
NSView *viewToReceiveNewButton = [self.fooController.panelForInput contentView];
[viewToReceiveNewButton addSubview:btnDontSave];
[btnDontSave release];
// Change the “proceed” button’s title to "Save", make it the default, and assign its action.
[self.fooController.btnProceed setTitle:NSLocalizedString(@"Save", @"Save")];
[self.fooController.btnProceed setKeyEquivalent:@"\r"];
[self.fooController.btnProceed setAction:@selector(saveAndQuitPerPendingConfirmPanel)]; // method defined in this, the appDelegate class
// Assign “Cancel” button's action.
[self.fooController.btnCancel setAction:@selector(callCancelQuit)];
// Finish setting up the panel and launch it.
// ...
}
Я заметил ранее, что типичные функции Cancel имеют тенденцию работать автоматически.Например, клавиша Escape автоматически вызывает любую кнопку, которую вы назвали «Отмена». Возможно, здесь работает аналогичный механизм за кадром.Если это так, я бы хотел лучше понять, что происходит.В настоящее время я обеспокоен тем, что эти перекрещивающиеся селекторы могут когда-нибудь сломаться, хотя все они пока работают нормально.Несоответствие вызывает беспокойство.