Какова цель использования IBAction и IBOutlet в кодировании Objective-C для iPhone, не имеет значения, если я их не использую?IBOutlet и IBAction
ответ
IBAction
и IBOutlet
- это макросы, определенные для обозначения переменных и методов, на которые можно ссылаться в Interface Builder.
IBAction
решает void
IBOutlet
и решает ничего, но они означают для Xcode и Interface Builder, что эти переменные и методы могут быть использованы в строителе интерфейса, чтобы связать элементы пользовательского интерфейса к коду.
Если вы вообще не собираетесь использовать Interface Builder, вам не нужны они в вашем коде, но если вы собираетесь его использовать, вам необходимо указать IBAction
для методов, которые будут использоваться в IB и IBOutlet
для объектов, которые будут использоваться в IB.
@Jasarien «вам нужно указать IBAction для методов, которые будут использоваться в IB и IBOutlet для объектов, которые будут использоваться в IB». В чем разница? – cyrilchampier
@nerith То же самое, что существует между методами и объектами. IBActions для методов, IBOutlet для объектов. – Jasarien
Чтобы уточнить, поскольку мое сообщение было отредактировано, 'IBOutlet' не разрешает' id'. Рассмотрим следующее: 'IBOutlet UILabel * nameLabel;' - если 'IBOutlet' разрешен' id', тогда этот код будет читать 'id UIlabel * namelabel;', который выдает ошибку компилятора. Как я изначально заявил, «IBOutlet» ни к чему не приводит. – Jasarien
Вам необходимо использовать IBOutlet и IBAction, если вы используете конструктор интерфейса (следовательно, префикс IB) для ваших компонентов графического интерфейса. IBOutlet необходим для связывания свойств в вашем приложении с компонентами в IB, а IBAction используется, чтобы ваши методы могли быть связаны с действиями в IB.
Например, предположим, что вы определили кнопку и метку в IB. Для того, чтобы динамически изменять значение метки, нажав на кнопку, вы будете определить действие и свойство в вашем приложении, аналогичное:
UILabel IBOutlet *myLabel;
-(IBAction) pushme;
Затем в ИБ вы соединили бы MyLabel с ярлыком и соединить метод pushme с кнопка. Вам нужны IBAction и IBOutlet, чтобы эти соединения существовали в IB.
, но почему это __следует work__, если вы не включили маркировку IBOutlet ..? – bobobobo
Поскольку эти макросы ничего не делают во время компиляции, они просто так, что приложение для построения интерфейса может найти эти методы и файлы конструктора интерфейса в исходном коде, чтобы вы могли перетаскивать между построителем интерфейса и вашим кодом, один из которых был создан, не имеет значения. –
IBAction ничего не делает во время редактирования, по крайней мере, в течение последнего десятилетия. Вы также можете подключить метод '(void)' в Interface Builder. –
IBAction и IBOutlets используются для подключения вашего интерфейса, выполненного в Interface Builder, с вашим контроллером. Если вы не будете использовать Interface Builder и полностью создадите свой интерфейс в коде, вы можете создать программу, не используя ее. Но на самом деле большинство из нас используют интерфейс Builder, как только вы захотите получить интерактивность в вашем интерфейсе, вам придется использовать IBActions и IBoutlets.
Интерфейс Builder использует их для определения того, какие члены и сообщения могут быть «подключены» к элементам управления интерфейсом, которые вы используете в своем окне/представлении.
IBOutlet и IBAction являются чисто там, в качестве маркеров, которые ищет интерфейс Builder, когда он анализирует ваш код во время разработки, они не влияют на код, сгенерированный компилятором.
Традиционный способ отметить метод, чтобы он появился в Interface Builder, и вы можете перетащить его к нему, заключается в том, чтобы метод возвращал тип IBAction. Однако, если вы сделаете свой метод недействительным, вместо этого (IBAction is # define'd будет недействительным) и укажите аргумент (id), метод все еще будет видимым. Это обеспечивает дополнительную гибкость, Аль
Все три из них видны с Interface Builder:
-(void) someMethod1:(id) sender;
-(IBAction) someMethod2;
-(IBAction) someMethod3:(id) sender;
См Руководство пользователя Apple, Interface Builder для деталей, в частности, раздел, озаглавленный Xcode интеграции.
Вот ссылка на приведенное выше руководство: https://developer.apple.com/library/ios/recipes/xcode_help-interface_builder/_index.html – Aggressor
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
Хм, нет, это не то, что такое IBOutlet. Откуда у вас эта идея? –
Я отредактировал свой ответ –
при использовании Interface Builder, вы можете использовать соединения Inspector для настройки событий обработчиком, обработчики событий должны быть функции, которые имеют IBAction модификатор. Вид может быть связан с ссылкой для того же типа и с модификатором IBOutlet.
Пройдись на диаграмму, глядя на кодировку с ключом, подумал, что это может помочь кому-то. Это помогает понять, что такое IBOutlet.
Просмотрев поток, можно видеть, что IBOutlets существуют только для соответствия имени свойства с управляющим именем в файле Nib.
Этот ответ объясняет работу _why_ и _how_ IBOutlets, а не только то, что они делают. –
Все ответы упоминают тот же тип идеи .. но никто не объясняет, почему Interface Builder, кажется, работает так же, если вы НЕ включают IBAction/IBOutlet в источнике. Есть ли другая причина для IBAction и IBOutlet, или это __ok, чтобы оставить их off__? – bobobobo
Ответ Майкла Роджерса ниже добавляет немного объяснения, почему код работает, даже когда IBAction не учитывается. – Krishna
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 –