2010-11-07 3 views
2

У меня есть приложение для какао, основанное на документе, с элементом в меню приложения, подключенным к IBAction. Щелчок на элементе должен выполнить задачу, которая использует IBOutlet в основном файле nib, который использует другой класс, MyDocument. Создание 2 объектов одного класса, по одному в каждом нибе, кажется, не работает. Как я могу получить доступ к розетке?Доступ к IBOutlet из других классов

+0

Вам нужно уточнить, что подключили к чему. Это не ясно из вашего описания. –

ответ

3

Действия для пунктов меню часто отправляются первому ответчику, так что все, что в настоящее время выбрано, может воздействовать на него.

Похоже, что это действие работает над текущим документом, тогда оно должно быть реализовано документом. В этом случае меню отправляет свое действие первому ответчику, а затем помещает метод действия в класс MyDocument.

Если действие, которое вы пытаетесь отправить, является обычным: в главном меню выберите пункт «Первый ответчик», добавьте имя метода, затем подключите селектор элемента к действию.

Прочтите раздел Responders раздела Cocoa Event-Handling Guide для получения дополнительной информации.

+0

Спасибо, что он отлично работает! – nosedive25

1

Чтобы суммировать вышесказанное, в вашем файле NIB/XIB, в построителе интерфейса сделайте соединение с объектом первого ответчика, а не с владельцем файлов или чем-либо еще. Вам по-прежнему будут предложены освещенные действия в отношении потенциальных первых респондентов.

Какао затем берет этот селектор и ищет его, начиная с NSView (если есть), который в настоящее время является первым ответчиком, а затем с помощью NSDocument, который в настоящее время используется, а затем с его оконным контроллером и т. Д. И т. Д. Вплоть до Участник приложения. Первый объект, который он проверяет, фактически реализует этот метод, будет использовать этот объект (после проверки его с тем же объектом).

Итак:

@interface MyDocumentTypeA : NSDocument { 
} 

-(void)myMenuAction:(id)sender; 

-

@interface MyDocumntTypeB : NSDocument { 
} 

// -myMenuAction: not implemented here 

-

@interface MyApplicationDelegate ... { 
} 

-(void)myMenuAction:(id)sender; 

-

В строителе Interface (или даже программно), если вы связали " действие "пункта меню на селектор с именем «myMenuAction:» на первом ответчике (который приравнивается к тому, чтобы не указывать цель при выполнении программно), для вышеуказанных двух подклассов документов произойдет следующее.

Для MyDocumentTypeA, когда пользователь выбирает этот пункт меню, MyDocumentTypeA -myMenuAction: будет вызываться. Поскольку MyDocumentTypeB не реализует это действие, Cocoa будет продолжать искать цепочку ответчиков до тех пор, пока не получит делегат приложения, который его реализует, поэтому вместо этого он будет вызываться здесь.

Если Cocoa не находит объектов в цепочке ответчиков, реализующих метод, элемент меню остается отключенным.

+0

Как вы «подключаетесь к объекту первого ответчика»? – Shamoon

Смежные вопросы