クラスFooControllerが所有するパネルxibがあります。FooControllerには、パネルの[キャンセル]ボタンと[続行]ボタンへのアウトレットもあります。
私は後で、このパネルをアプリケーションデリゲートの終了ルーチンで使用するためにリサイクルすることにしました。ボタンにセレクターを割り当てたところ、[続行/保存]ボタンとプログラムで追加された[DontSave]ボタンが、アプリケーションデリゲートクラスで定義されたメソッドをセレクターとして受け入れることができることがわかりました。ただし、[キャンセル]ボタンは、セレクターが所有者クラスFooControllerで定義されていない限り、「認識されないセレクター」エラーを引き起こします。
いいでしょう、それは論理的に思えました。一貫性を保つために、FooControllerクラスにもProceed/SaveセレクターとDontSaveセレクターを設定しました。しかし、その後、「認識されないセレクター」エラーが生成されます。
したがって、[キャンセル]ボタンでは、セレクターがFooControllerクラスにある必要があります。[続行/保存]ボタンと[保存しない]ボタンでは、セレクターがappDelegateクラスにある必要があります。ただし、3つのボタンはすべて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キーは、「キャンセル」というタイトルのボタンを自動的に呼び出します。たぶん、ここで同様の舞台裏の機械が働いています。もしそうなら、私は何が起こっているのかをよりよく理解したいと思います。現在のところ、これらの交差するセレクターは、今のところすべて正常に機能しているにもかかわらず、いつか壊れてしまうのではないかと心配しています。矛盾は厄介です。