IBOutlet и IBAction

159

Какова цель использования IBOutlets и IBActions в Xcode и Interface Builder?

Имеет ли какое-то значение, если я не использую IBOutlets и IBActions?


Swift:

@IBOutlet weak var textField: UITextField!

@IBAction func buttonPressed(_ sender: Any) { /* ... */ }

Objective-C:

@property (nonatomic, weak) IBOutlet UITextField *textField;

- (IBAction)buttonPressed:(id)sender { /* ... */ }
SUSE
источник
12
Во всех ответах упоминается идея одного типа ... но никто не объясняет, почему Interface Builder работает точно так же, если вы НЕ включаете IBAction / IBOutlet в свой источник. Есть ли другая причина для IBAction и IBOutlet или это нормально, чтобы оставить их ?
Бобобобо
2
Ответ Майкла Роджерса, приведенный ниже, добавляет немного объяснения о том, почему код работает, даже если IBAction пропущен.
Кришна
IBActions существуют как часть механизма взаимодействия целевого действия, вы можете прочитать о том, как IBAction вписывается в это здесь: developer.apple.com/library/ios/documentation/General/… Вы можете прочитать о Outlets здесь: developer.apple. com / библиотека / ios / документация / общие сведения /…
Уильям Пауэр

Ответы:

208

IBActionи IBOutletмакросы, определенные для обозначения переменных и методов, на которые можно ссылаться в Интерфейсном Разработчике.

IBActionразрешает voidи IBOutletничего не решает, но для Xcode и Interface Builder они означают, что эти переменные и методы могут быть использованы в Interface Builder для связи элементов UI с вашим кодом.

Если вы вообще не собираетесь использовать Interface Builder, тогда они вам не нужны в вашем коде, но если вы собираетесь его использовать, вам нужно указать IBActionметоды, которые будут использоваться в IB, и IBOutletобъекты это будет использоваться в IB.

Jasarien
источник
@Jasarien "вам нужно указать IBAction для методов, которые будут использоваться в IB, и IBOutlet для объектов, которые будут использоваться в IB." Какая разница ?
cyrilchampier
3
@nerith Та же разница, что существует между методами и объектами. IBActions для методов, IBOutlet для объектов.
Jasarien
Просто чтобы уточнить, так как мой пост был отредактирован, IBOutletне разрешается id. Учтите это: IBOutlet UILabel *nameLabel;- если IBOutletразрешить id, то этот код будет читать, id UIlabel *namelabel;что приводит к ошибке компилятора. Как я изначально говорил, IBOutletничего не решается.
Jasarien
38

Традиционный способ пометить метод, чтобы он появился в Интерфейсном Разработчике, и вы можете перетащить соединение с ним, состоял в том, чтобы заставить метод возвращать тип IBAction. Однако, если вместо этого вы сделаете ваш метод недействительным (IBAction равен # define'd быть пустым) и предоставите аргумент (id), метод все равно будет виден. Это обеспечивает дополнительную гибкость, все

Все 3 из них видны из Интерфейсного Разработчика:

-(void) someMethod1:(id) sender; 
-(IBAction) someMethod2; 
-(IBAction) someMethod3:(id) sender;

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

Майкл Роджерс
источник
1
Вот ссылка на выше руководства предложил: developer.apple.com/library/ios/recipes/...
Aggressor
32

Вам необходимо использовать IBOutlet и IBAction, если вы используете конструктор интерфейса (отсюда префикс IB) для компонентов GUI. IBOutlet необходим для связи свойств вашего приложения с компонентами в IB, а IBAction используется для того, чтобы ваши методы могли быть связаны с действиями в IB.

Например, предположим, что вы определяете кнопку и метку в IB. Чтобы динамически изменить значение метки, нажав кнопку, вы определите действие и свойство в своем приложении, например:

UILabel IBOutlet *myLabel;
- (IBAction)pushme:(id)sender;

Затем в IB вы должны связать myLabel с меткой и подключить метод pushme с помощью кнопки. Вам нужны IBAction и IBOutlet, чтобы эти соединения существовали в IB.

ennuikiller
источник
13
но почему это все еще работает, если вы не включили маркировку IBOutlet?
Бобобобо
7
Поскольку эти макросы ничего не делают во время компиляции, они просто так, чтобы приложение сборки интерфейса могло найти эти методы и файлы построителя интерфейса в исходном коде, чтобы вы могли перетаскивать между построителем интерфейса и вашим кодом, одно соединение установлено, но это не так. больше неважно
Натан День
IBAction ничего не делает во время редактирования, по крайней мере, в течение последнего десятилетия. Вы также можете подключить (void)метод в Интерфейсном Разработчике.
Дж. Коко
7

Интерфейсный Разработчик использует их, чтобы определить, какие элементы и сообщения могут быть «подключены» к элементам управления интерфейса, которые вы используете в своем окне / представлении.

IBOutlet и IBAction присутствуют исключительно как маркеры, которые Интерфейсный Разработчик ищет, когда он анализирует ваш код во время разработки, они не оказывают никакого влияния на код, сгенерированный компилятором.

KazR
источник
7

Заработал на схеме, глядя на кодирование значения ключа, подумал, что это может кому-то помочь. Это помогает понять, что такое IBOutlet.

Глядя на поток, можно увидеть, что IBOutlets существуют только для того, чтобы сопоставить имя свойства с именем элемента управления в файле Nib.

Как загружается nib-файл, скриншот онлайн-книги Мэтта для iOS6

NSCoder
источник
Этот ответ объясняет, почему и как работают IBOutlets, а не только то, что они делают .
Джеффри Опоку-Менсах
4

Outlet - это ссылка из кода на пользовательский интерфейс. Если вы хотите показать или скрыть элемент пользовательского интерфейса, если вы хотите получить текст текстового поля или включить или отключить элемент (или сотню других вещей), вы должны определить выход этого объекта в источниках и связать этот выход через «объект интерфейса» к элементу пользовательского интерфейса. После этого вы можете использовать выход, как и любую другую переменную в вашем коде.

IBAction - специальный метод, запускаемый объектами пользовательского интерфейса. Интерфейсный Разработчик распознает их.

@interface Controller
{
  IBOutlet id textField; // links to TextField UI object
}

- (IBAction)doAction:(id)sender; // e.g. called when button pushed

Для получения дополнительной информации, пожалуйста, обратитесь Apple Docs

पवन
источник
Хм, нет, это не то, чем является IBOutlet. Откуда у тебя эта идея?
Ричард Дж. Росс III
3

IBAction и IBOutlets используются для соединения вашего интерфейса, созданного в Интерфейсном Разработчике, с вашим контроллером. Если вы не используете Interface Builder и полностью не строите свой интерфейс в коде, вы можете создать программу, не используя их. Но на самом деле большинство из нас использует Interface Builder, и если вы хотите, чтобы в вашем интерфейсе появилась некоторая интерактивность, вам придется использовать IBActions и IBoutlets.

Янник Компернол
источник
2

IBOutlet

  • Это собственность .
  • Когда файл nib (IB) загружен, он становится частью инкапсулированных данных, которые подключаются к переменной экземпляра.
  • Каждое соединение разархивировано и восстановлено.

IBAction

  • Атрибут указывает, что метод является действием, к которому вы можете подключиться из раскадровки в Интерфейсном Разработчике.

@ - Динамический шаблон IB - Интерфейсный Разработчик

Винот Анандан
источник
2

Один из главных комментариев по этому Вопросу специально спрашивает:

Во всех ответах упоминается идея одного типа ... но никто не объясняет, почему Interface Builder работает точно так же, если вы НЕ включаете IBAction / IBOutlet в свой источник. Есть ли другая причина для IBAction и IBOutlet или это нормально, чтобы оставить их?


На этот вопрос хорошо ответил NSHipster:

IBAction

https://nshipster.com/ibaction-iboutlet-iboutletcollection/#ibaction

Еще в 2004 году (и, возможно, ранее), IBAction больше не был необходим для того, чтобы метод был замечен Интерфейсным Разработчиком. Любой метод с подписью -(void){name}:(id)senderбудет виден на панели выходов.

Тем не менее, многие разработчики считают полезным по-прежнему использовать возвращаемый тип IBAction в объявлениях методов для обозначения того, что конкретный метод связан с действием. Даже проекты, не использующие раскадровки / XIB, могут использовать IBAction для вызова методов target / action.

IBOutlet:

https://nshipster.com/ibaction-iboutlet-iboutletcollection/#iboutlet

В отличие от IBAction, IBOutlet все еще требуется для соединения свойств в коде с объектами в раскадровке или XIB.

Соединение IBOutlet обычно устанавливается между представлением или элементом управления и его управляющим контроллером представления (это часто делается в дополнение к любым действиям IBA, которые может выполнять целевой контроллер для ответчика). Однако IBOutlet также может использоваться для предоставления свойства верхнего уровня, такого как другой контроллер или свойство, к которому затем может обращаться ссылочный контроллер представления.

pkamb
источник
1

когда вы используете Interface Builder, вы можете использовать Connections Inspector для настройки событий с помощью обработчиков событий, предполагается, что обработчиками событий являются функции, имеющие модификатор IBAction. Представление может быть связано со ссылкой для того же типа и с модификатором IBOutlet.

зефир
источник