Доступ к IBOutlet из других классов

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


person nosedive25    schedule 07.11.2010    source источник
comment
Нужно уточнить, что к чему подключено. Это не ясно из вашего описания.   -  person Joshua Nozzi    schedule 08.11.2010


Ответы (3)


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

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

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

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

person Nathan Kinsinger    schedule 08.11.2010

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

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

So:

@interface MyDocumentTypeA : NSDocument {
}

-(void)myMenuAction:(id)sender;

-

@interface MyDocumntTypeB : NSDocument {
}

// -myMenuAction: not implemented here

-

@interface MyApplicationDelegate ... {
}

-(void)myMenuAction:(id)sender;

-

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

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

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

person d11wtq    schedule 08.11.2010
comment
Как вы «устанавливаете соединение с объектом первого респондента»? - person Shamoon; 23.08.2012

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

person Erik    schedule 19.08.2011