IBOutlet и IBAction
Какова цель использования IBAction и IBOutlet в кодировании Objective-C для iPhone, имеет ли какое-то значение, если я их не использую?
11 ответов
IBAction
а также IBOutlet
макросы, определенные для обозначения переменных и методов, на которые можно ссылаться в Интерфейсном Разработчике.
IBAction
решает в void
а также IBOutlet
ничего не решает, но они указывают Xcode и Interface Builder, что эти переменные и методы могут использоваться в Interface Builder для связи элементов UI с вашим кодом.
Если вы вообще не собираетесь использовать Interface Builder, то они вам не нужны в вашем коде, но если вы собираетесь его использовать, вам нужно указать IBAction
для методов, которые будут использоваться в IB и IBOutlet
для объектов, которые будут использоваться в IB.
Традиционный способ пометить метод, чтобы он появился в Интерфейсном Разработчике, и вы можете перетащить соединение с ним, состоял в том, чтобы заставить метод возвращать тип IBAction. Однако если вместо этого вы сделаете свой метод недействительным (IBAction равен #define'd быть пустым) и предоставите аргумент (id), метод все равно будет виден. Это обеспечивает дополнительную гибкость, все
Все 3 из них видны из Интерфейсного Разработчика:
-(void) someMethod1:(id) sender;
-(IBAction) someMethod2;
-(IBAction) someMethod3:(id) sender;
См. Руководство пользователя Интерфейсного Разработчика Apple для деталей, особенно раздел, озаглавленный Интеграция XCode.
Вам необходимо использовать IBOutlet и IBAction, если вы используете конструктор интерфейса (следовательно, префикс IB) для компонентов GUI. IBOutlet необходим для связи свойств вашего приложения с компонентами в IB, а IBAction используется для того, чтобы ваши методы могли быть связаны с действиями в IB.
Например, предположим, что вы определяете кнопку и метку в IB. Чтобы динамически изменить значение метки, нажав кнопку, вы определите действие и свойство в своем приложении, например:
UILabel IBOutlet *myLabel;
-(IBAction) pushme;
Затем в IB вы должны связать myLabel с меткой и подключить метод pushme с помощью кнопки. Вам нужны IBAction и IBOutlet, чтобы эти соединения существовали в IB.
Бежал в диаграмму, глядя на кодирование значения ключа, подумал, что это может кому-то помочь. Это помогает понять, что такое IBOutlet.
Глядя на поток, можно увидеть, что IBOutlets существуют только для того, чтобы сопоставить имя свойства с именем элемента управления в файле Nib.
Интерфейсный Разработчик использует их, чтобы определить, какие элементы и сообщения могут быть "подключены" к элементам управления интерфейса, которые вы используете в своем окне / представлении.
IBOutlet и IBAction присутствуют исключительно как маркеры, которые Интерфейсный Разработчик ищет, когда он анализирует ваш код во время разработки, они не оказывают никакого влияния на код, сгенерированный компилятором.
Outlet - это ссылка из кода на пользовательский интерфейс. Если вы хотите показать или скрыть элемент пользовательского интерфейса, если вы хотите получить текст текстового поля или включить или отключить элемент (или сотню других вещей), вы должны определить выход этого объекта в источниках и связать этот выход через "объект интерфейса" к элементу пользовательского интерфейса. После этого вы можете использовать выход, как и любую другую переменную в вашем коде.
IBAction - специальный метод, запускаемый объектами пользовательского интерфейса. Интерфейсный Разработчик распознает их.
@interface Controller
{
IBOutlet id textField; // links to TextField UI object
}
- (IBAction)doAction:(id)sender; // e.g. called when button pushed
Для получения дополнительной информации, пожалуйста, обратитесь Apple Docs
IBAction и IBOutlets используются для соединения вашего интерфейса, созданного в Интерфейсном Разработчике, с вашим контроллером. Если вы не используете Interface Builder и полностью не строите свой интерфейс в коде, вы можете создать программу, не используя их. Но на самом деле большинство из нас использует Interface Builder, когда вы хотите, чтобы в вашем интерфейсе появилась некоторая интерактивность, вам придется использовать IBActions и IBoutlets.
Один из главных комментариев по этому вопросу конкретно спрашивает:
Во всех ответах упоминается один и тот же тип идеи... но никто не объясняет, почему Interface Builder, похоже, работает точно так же, если вы НЕ включаете IBAction / IBOutlet в свой источник. Есть ли еще одна причина для использования IBAction и IBOutlet или их можно не использовать?
На этот вопрос хорошо отвечает NSHipster:
IBAction
https://nshipster.com/ibaction-iboutlet-iboutletcollection/
Еще в 2004 году (а, возможно, и раньше) в IBAction больше не было необходимости для того, чтобы метод был замечен Interface Builder. Любой метод с подписью
-(void){name}:(id)sender
будет отображаться на панели розеток.Тем не менее, многие разработчики считают полезным по-прежнему использовать тип возвращаемого значения IBAction в объявлениях методов, чтобы обозначать, что конкретный метод связан с действием. Даже проекты, не использующие раскадровки / XIB, могут использовать IBAction для вызова методов цели / действия.
IBOutlet:
https://nshipster.com/ibaction-iboutlet-iboutletcollection/
В отличие от IBAction, IBOutlet по-прежнему требуется для связи свойств в коде с объектами в раскадровке или XIB.
Соединение IBOutlet обычно устанавливается между представлением или элементом управления и его управляющим контроллером представления (это часто делается в дополнение к любым действиям IBA, которые контроллер представления может быть нацелен на выполнение ответчиком). Однако IBOutlet также можно использовать для предоставления свойства верхнего уровня, такого как другой контроллер или свойство, к которому затем может получить доступ ссылающийся контроллер представления.
IBOutlet
- Это собственность.
- Когда файл nib(IB) загружен, он становится частью инкапсулированных данных, которые подключаются к переменной экземпляра.
- Каждое соединение разархивировано и восстановлено.
IBAction
- Атрибут указывает, что метод является действием, к которому вы можете подключиться из раскадровки в Интерфейсном Разработчике.
@ - Динамический шаблон IB - Интерфейсный Разработчик
Когда вы используете Interface Builder, вы можете использовать Connections Inspector для настройки событий с помощью обработчиков событий, предполагается, что обработчиками событий являются функции, имеющие модификатор IBAction. Представление может быть связано со ссылкой для того же типа и с модификатором IBOutlet.
Я не знал, что они вам больше не нужны, раньше они были для того, чтобы разработчик интерфейса мог найти их в вашем источнике, в быстром режиме я бы представил, что IBAction все еще нужен, потому что ему нужно было изменить способ вашего метода может быть вызван из построителя интерфейса, хотя я представляю, как @objc сделал бы то же самое. Я лично намерен продолжать использовать их, потому что они документируют то, что должен делать метод или интерфейс.