2009-10-29 12 views
146

Какова цель использования IBAction и IBOutlet в кодировании Objective-C для iPhone, не имеет значения, если я их не использую?IBOutlet и IBAction

+12

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

+2

Ответ Майкла Роджерса ниже добавляет немного объяснения, почему код работает, даже когда IBAction не учитывается. – Krishna

+0

IBActions существуют как часть механизма взаимодействия с целевым действием, вы можете прочитать о том, как IBAction вписывается сюда: https://developer.apple.com/library/ios/documentation/General/Conceptual/CocoaEncyclopedia/Target-Action/ Target-Action.html # // apple_ref/doc/uid/TP40010810-CH12 Здесь вы можете прочитать здесь: https://developer.apple.com/library/ios/documentation/General/Conceptual/CocoaEncyclopedia/Outlets /Outlets.html#//apple_ref/doc/uid/TP40010810-CH10-SW1 –

ответ

194

IBAction и IBOutlet - это макросы, определенные для обозначения переменных и методов, на которые можно ссылаться в Interface Builder.

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

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

+0

@Jasarien «вам нужно указать IBAction для методов, которые будут использоваться в IB и IBOutlet для объектов, которые будут использоваться в IB». В чем разница? – cyrilchampier

+3

@nerith То же самое, что существует между методами и объектами. IBActions для методов, IBOutlet для объектов. – Jasarien

+0

Чтобы уточнить, поскольку мое сообщение было отредактировано, 'IBOutlet' не разрешает' id'. Рассмотрим следующее: 'IBOutlet UILabel * nameLabel;' - если 'IBOutlet' разрешен' id', тогда этот код будет читать 'id UIlabel * namelabel;', который выдает ошибку компилятора. Как я изначально заявил, «IBOutlet» ни к чему не приводит. – Jasarien

30

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

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

UILabel IBOutlet *myLabel; 
-(IBAction) pushme; 

Затем в ИБ вы соединили бы MyLabel с ярлыком и соединить метод pushme с кнопка. Вам нужны IBAction и IBOutlet, чтобы эти соединения существовали в IB.

+13

, но почему это __следует work__, если вы не включили маркировку IBOutlet ..? – bobobobo

+7

Поскольку эти макросы ничего не делают во время компиляции, они просто так, что приложение для построения интерфейса может найти эти методы и файлы конструктора интерфейса в исходном коде, чтобы вы могли перетаскивать между построителем интерфейса и вашим кодом, один из которых был создан, не имеет значения. –

+0

IBAction ничего не делает во время редактирования, по крайней мере, в течение последнего десятилетия. Вы также можете подключить метод '(void)' в Interface Builder. –

3

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

5

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

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

38

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

Все три из них видны с Interface Builder:

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

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

+1

Вот ссылка на приведенное выше руководство: https://developer.apple.com/library/ios/recipes/xcode_help-interface_builder/_index.html – Aggressor

3

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

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

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

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

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

+0

Хм, нет, это не то, что такое IBOutlet. Откуда у вас эта идея? –

+0

Я отредактировал свой ответ –

1

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

2

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

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

How nib file is loaded, screenshot of Matt's online book for iOS6

+0

Этот ответ объясняет работу _why_ и _how_ IBOutlets, а не только то, что они делают. –

 Смежные вопросы

  • Нет связанных вопросов^_^