Подводя итог вышесказанному, в своем файле NIB / XIB в конструкторе интерфейсов установите соединение с объектом «Первый ответчик», а не с «Владельцем файлов» или чем-либо еще.Вам по-прежнему будет предложено множество действий для потенциальных первых респондентов.
Какао затем берет этот селектор и ищет его, начиная с NSView (если есть), который в настоящее время является первым респондентом, затем с NSDocument, которыйв настоящее время используется, затем с его оконным контроллером и т. д. вплоть до делегата приложения.Первый проверенный объект, который фактически реализует этот метод, будет использовать этот объект (после проверки его тем же объектом).
Итак:
@interface MyDocumentTypeA : NSDocument {
}
-(void)myMenuAction:(id)sender;
-
@interface MyDocumntTypeB : NSDocument {
}
// -myMenuAction: not implemented here
-
@interface MyApplicationDelegate ... {
}
-(void)myMenuAction:(id)sender;
-
В Интерфейсном конструкторе (или даже программно), если вы связали «действие» пункта меню с селектором с именем «myMenuAction:»в первом ответчике (что означает отсутствие указания цели, когда это делается программно), для двух вышеупомянутых подклассов документов произойдет следующее.
Для MyDocumentTypeA, когда пользователь выбирает этот пункт меню, MyDocumentTypeA's -myMenuAction: willбыть призван.Так как MyDocumentTypeB не реализует это действие, Какао будет продолжать искать цепочку респондента до тех пор, пока не получит делегат приложения, который его реализует, поэтому вместо этого он будет вызываться здесь.
Если Какао не находит объекты вВ цепочке респондента, реализующей метод, пункт меню остается отключенным.