Доступ к IBOutlet из других классов - PullRequest
2 голосов
/ 08 ноября 2010

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

Ответы [ 3 ]

3 голосов
/ 08 ноября 2010

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

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

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

Прочтите раздел Респонденты в Руководстве по обработке событий Какао , чтобы узнать большеИнформация.

1 голос
/ 08 ноября 2010

Подводя итог вышесказанному, в своем файле 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 не реализует это действие, Какао будет продолжать искать цепочку респондента до тех пор, пока не получит делегат приложения, который его реализует, поэтому вместо этого он будет вызываться здесь.

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

0 голосов
/ 19 августа 2011

Есть способ как это сделать, я выложил ответ в похожей теме: Доступ к IBOutlet из другого класса (ObjC)

...