IBOutlet та IBAction


159

Яка мета використання IBOutlets та IBActions в Xcode and Interface Builder?

Чи має значення, якщо я не використовую IBOutlets та IBActions?


Швидкий:

@IBOutlet weak var textField: UITextField!

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

Завдання-C:

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

- (IBAction)buttonPressed:(id)sender { /* ... */ }

12
У всіх відповідях згадується однаковий тип ідеї .. але ніхто не пояснює, чому здається, що Інтерфейс Builder працює так само, якщо ви НЕ включаєте IBAction / IBOutlet у своє джерело. Чи є ще одна причина для IBAction та IBOutlet чи це нормально, щоб їх залишити ?
bobobobo

2
Відповідь Майкла Роджерса нижче додає трохи пояснень, чому код працює навіть тоді, коли IBAction залишився.
Кришна,

IBActions існують як частина механізму взаємодії цільових дій, ви можете прочитати про те, як IBAction вписується тут: developer.apple.com/library/ios/documentation/General/… Ви можете прочитати на Outlets тут: developer.apple. com / бібліотека / ios / документація / Загальні /…
William Power

Відповіді:


208

IBActionі IBOutletє макросами, визначеними для позначення змінних та методів, на які можна посилатися в Interface Builder.

IBActionвирішує voidі не IBOutletвирішує нічого, але вони вказують на програму Xcode and Interface builder, що ці змінні та методи можуть використовуватися в Builder інтерфейсу для прив'язки елементів інтерфейсу до вашого коду.

Якщо ви взагалі не будете використовувати Interface Builder, то вони вам не потрібні у своєму коді, але якщо ви збираєтесь ним користуватися, то вам потрібно вказати IBActionметоди, які будуть використовуватися в IB та IBOutletдля об'єктів які будуть використовуватися в ІБ.


@Jasarien "Вам потрібно вказати IBAction для методів, які будуть використовуватися в IB і IBOutlet для об'єктів, які будуть використовуватися в IB." Яка різниця ?
cyrilchampier

3
@nerith Та сама різниця, що існує між методами та об'єктами. IBActions для методів, IBOutlet для об'єктів.
Jasarien

Просто для уточнення, оскільки моя публікація була відредагована, IBOutletне вирішується id. Враховуйте це: IBOutlet UILabel *nameLabel;- якщо це IBOutletвирішено id, тоді читається той код, id UIlabel *namelabel;який створює помилку компілятора. Як я спочатку заявив, IBOutletвирішується ні до чого.
Jasarien

38

Традиційний спосіб позначити метод таким чином, щоб він з'явився в Interface Builder, і ви можете перетягнути з'єднання з ним, полягав у тому, щоб зробити метод повернення типу IBAction. Однак якщо ви робите метод недійсним, замість цього (IBAction є # define'd to void) та надаєте аргумент (id), метод все одно видно. Це забезпечує додаткову гнучкість, ін

Усі 3 з них видно в Interface Builder:

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

Докладніше див. У Посібнику користувача для Інтерфейсу для побудови інтерфейсів Apple, зокрема, розділ під назвою Інтеграція Xcode.


1
Ось посилання на запропонований вище посібник: developer.apple.com/library/ios/recipes/…
Агресор

32

Вам потрібно використовувати IBOutlet та IBAction, якщо ви використовуєте конструктор інтерфейсів (отже, префікс IB) для компонентів GUI. IBOutlet потрібен для асоціації властивостей вашої програми з компонентами в IB, а IBAction використовується для того, щоб ваші методи були пов'язані з діями в IB.

Наприклад, припустимо, ви визначаєте кнопку та мітку в IB. Щоб динамічно змінити значення мітки натисканням кнопки, ви визначите дію та властивість у вашому додатку, подібні до:

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

Тоді в IB ви з'єднаєте myLabel з міткою і з'єднаєте метод pushme з кнопкою. Вам потрібні IBAction та IBOutlet, щоб ці з'єднання існували в ІБ.


13
але чому це все-таки працює, якщо ви не включаєте маркування IBOutlet ..?
bobobobo

7
Оскільки ці макроси нічого не роблять під час компіляції, вони просто тому додаток для збирання інтерфейсу може знайти ці методи та файли конструктора інтерфейсів у вихідному коді, щоб ви могли перетягуватися між конструктором інтерфейсу та вашим кодом. більше не має значення.
День Натана

IBAction також нічого не робить під час редагування, принаймні, протягом останнього десятиліття. Ви також можете підключити (void)метод в Interface Builder.
J. Cocoe

7

Інтерфейс Builder використовує їх, щоб визначити, які члени та повідомлення можна "підключити" до елементів управління інтерфейсом, які ви використовуєте у вікні / перегляді.

IBOutlet і IBAction суто є маркерами, які шукає Interface Builder, коли він аналізує ваш код під час проектування, вони не впливають на код, сформований компілятором.


7

Забігаючи на діаграму, переглядаючи кодування ключових значень, думав, що це може комусь допомогти. Це допомагає зрозуміти, що таке IBOutlet.

Подивившись на потік, можна було побачити, що IBOutlets є лише там, щоб узгодити ім'я властивості з іменем керування у файлі Nib.

Як завантажується файл nib, скріншот онлайн-книги Метта для iOS6


Ця відповідь пояснює, чому і як працюють IBOutlets, а не лише те, що вони роблять .
Jeffery Opoku-Mensah

4

Outlet - це посилання від коду до інтерфейсу користувача. Якщо ви хочете показати або приховати елемент інтерфейсу, якщо ви хочете отримати текст текстового поля або ввімкнути або вимкнути елемент (або ще сто речей), вам слід визначити випускний елемент цього об’єкта у джерелах і зв’язати цю розетку через "об'єкт інтерфейсу" до елемента інтерфейсу. Після цього ви можете використовувати розетку так само, як і будь-яку іншу змінну в кодуванні.

IBAction - спеціальний метод, що спрацьовує об'єктами інтерфейсу користувача. Інтерфейс Builder розпізнає їх.

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

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

Для отримання додаткової інформації зверніться до Документів Apple


Нм, ні, це не те, що таке IBOutlet. Звідки ви взяли таку ідею?
Річард Дж. Росс III

3

IBAction та IBOutlets використовуються для підключення вашого інтерфейсу, створеного в Interface Builder, до вашого контролера. Якщо ви не використовуєте Interface Builder і повністю будуєте свій інтерфейс у коді, ви можете зробити програму без їх використання. Але насправді більшість із нас використовує Interface Builder. Після того, як ви захочете отримати деяку інтерактивність у вашому інтерфейсі, вам доведеться використовувати IBActions та IBoutlets.


2

IBOutlet

  • Це властивість .
  • Коли файл nib (IB) завантажується, він стає частиною капсульованих даних, які підключаються до змінної екземпляра.
  • Кожен зв'язок неархівований і відновлюється.

IBAction

  • Атрибут вказує на те, що метод - це дія, до якої ви можете підключитися зі своєї розгортки в Інтерфейсі.

@ - Динамічний візерунок ІБ - Інтерфейс Builder


2

Один із найкращих коментарів до цього питання спеціально задає:

У всіх відповідях згадується однаковий тип ідеї .. але ніхто не пояснює, чому здається, що Інтерфейс Builder працює так само, якщо ви НЕ включаєте IBAction / IBOutlet у своє джерело. Чи є ще одна причина IBAction та IBOutlet чи це нормально, щоб їх залишити?


На це питання добре відповідає NSHipster:

IBAction

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

Ще в 2004 році (а може і раніше) IBAction вже не була необхідною для того, щоб метод, який помітив Interface Builder. Будь-який метод з підписом-(void){name}:(id)sender буде видно на панелі торгових точок.

Тим не менш, багато розробників вважають корисним використовувати тип повернення IBAction у деклараціях методів, щоб позначити, що певний метод пов'язаний з дією. Навіть проекти, які не використовують розгортки / XIB, можуть скористатися IBAction для виклику методів цілей / дій.

IBOutlet:

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

На відміну від IBAction, IBOutlet все ще потрібен для підключення властивостей у коді з об'єктами на Storyboard або XIB.

З'єднання IBOutlet зазвичай встановлюється між переглядом або елементом управління та його керуючим контролером перегляду (це часто робиться на додаток до будь-яких IBActions, на які контролер перегляду може бути націлений, щоб виконати відповідь). Однак IBOutlet може також використовуватися для викриття властивості верхнього рівня, як іншого контролера або властивості, до якої потім може бути доступний контролер перегляду посилань.


1

коли ви використовуєте Interface Builder, ви можете використовувати Інспектор підключень для налаштування подій з обробниками подій, обробники подій повинні бути функціями, які мають модифікатор IBAction. Вид може бути пов'язаний з посиланням на той самий тип і з модифікатором IBOutlet.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.