我有一个属于 FooController 类的面板 xib。FooController 也有面板的取消和继续按钮的出口。
后来我决定回收这个面板供应用程序委托的终止例程使用。当我将选择器分配给按钮时,我发现继续/保存按钮和以编程方式添加的 DontSave 按钮可以接受应用程序委托类中定义的选择器方法。但是取消按钮会导致“无法识别的选择器”错误,除非它的选择器是在所有者类 FooController 中定义的。
好吧,这似乎是合乎逻辑的。为了保持一致,我也在 FooController 类中设置了 Proceed/Save 和 DontSave 选择器。但随后它们会产生“无法识别的选择器”错误。
因此,取消按钮要求其选择器位于 FooController 类中。Proceed/Save 和 DontSave 按钮要求它们的选择器位于 appDelegate 类中。但是所有三个按钮都显式地归 FooController 所有;正如您在下面的代码中看到的,即使添加的 DontSave 按钮也显式分配给 FooController 拥有的面板的 contentView:
- (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.
// ...
}
我之前注意到典型的取消功能往往会自动工作。例如,Escape 键会自动调用您标题为“取消”的任何按钮。也许这里有类似的幕后机器在工作。如果是这样,我希望我能更好地理解发生了什么。就目前而言,我担心这些纵横交错的选择器有一天可能会损坏,即使它们现在都可以正常工作。这种不一致令人不安。