IBOutlet e IBAction

159

Qual é o objetivo de usar IBOutlets e IBActions no Xcode e no Interface Builder?

Faz alguma diferença se eu não usar IBOutlets e IBActions?


Rápido:

@IBOutlet weak var textField: UITextField!

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

Objetivo-C:

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

- (IBAction)buttonPressed:(id)sender { /* ... */ }
suse
fonte
12
Todas as respostas mencionam o mesmo tipo de idéia. Mas ninguém explica por que o Interface Builder parece funcionar da mesma maneira se você NÃO incluir o IBAction / IBOutlet em sua fonte. Existe outro motivo para o IBAction e o IBOutlet ou está correto deixá-los de fora ?
9119 bobobobo
2
A resposta de Michael Rogers abaixo adiciona uma explicação de por que o código funciona mesmo quando o IBAction é deixado de fora.
Krishna
As IBActions existem como parte do mecanismo de interação de ação-alvo. Você pode ler sobre como o IBAction se encaixa nisso aqui: developer.apple.com/library/ios/documentation/General/… Você pode ler em Outlets aqui: developer.apple. com / library / ios / documentation / General /…
William Power

Respostas:

208

IBActione IBOutletsão macros definidas para indicar variáveis ​​e métodos que podem ser referidos no Interface Builder.

IBActionresolve voide IBOutletresolve para nada, mas significa para o construtor Xcode and Interface que essas variáveis ​​e métodos podem ser usados ​​no construtor Interface para vincular elementos da interface do usuário ao seu código.

Se você não usará o Interface Builder, não precisará deles em seu código, mas se quiser usá-lo, precisará especificar os IBActionmétodos que serão usados ​​no IB e IBOutletnos objetos. que será usado no IB.

Jasarien
fonte
@ Jasarien "você precisa especificar IBAction para métodos que serão usados ​​no IB e IBOutlet para objetos que serão usados ​​no IB." Qual é a diferença ?
Cyrilchampier
3
@nerith A mesma diferença que existe entre métodos e objetos. IBActions para métodos, IBOutlet para objetos.
Jasarien
Só para esclarecer, desde que meu post foi editado, IBOutletnão resolve id. Considere o seguinte: IBOutlet UILabel *nameLabel;- se for IBOutletresolvido id, esse código será lido, o id UIlabel *namelabel;que produzirá um erro do compilador. Como afirmei originalmente, IBOutletresolve em nada.
Jasarien 20/08/2012
38

A maneira tradicional de sinalizar um método para que ele apareça no Interface Builder, e você pode arrastar uma conexão a ele, é fazer com que o método retorne o tipo IBAction. No entanto, se você tornar seu método nulo, em vez disso (IBAction é # definido para ser nulo) e fornecer um argumento (id), o método ainda estará visível. Isso fornece flexibilidade extra, sempre

Todos os três são visíveis no Interface Builder:

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

Consulte o Guia do usuário do Apple Interface Builder para obter detalhes, particularmente a seção intitulada Xcode Integration.

Michael Rogers
fonte
1
Aqui está um link para o guia acima sugerido: developer.apple.com/library/ios/recipes/…
Aggressor
32

É necessário usar o IBOutlet e o IBAction se você estiver usando o construtor de interface (daí o prefixo IB) para os componentes da GUI. O IBOutlet é necessário para associar propriedades em seu aplicativo a componentes no IB, e o IBAction é usado para permitir que seus métodos sejam associados a ações no IB.

Por exemplo, suponha que você defina um botão e um rótulo no IB. Para alterar dinamicamente o valor do rótulo pressionando o botão, você definirá uma ação e propriedade em seu aplicativo semelhante a:

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

Em IB, você conectaria o myLabel ao rótulo e o método pushme ao botão. Você precisa do IBAction e do IBOutlet para que essas conexões existam no IB.

ennuikiller
fonte
13
mas por que ainda funciona se você não inclui a etiqueta IBOutlet?
9119 bobobobo
7
Como essas macros não fazem nada em tempo de compilação, elas são simplesmente para que o aplicativo de criação de Interface possa encontrar esses métodos e arquivos do construtor de interface no código-fonte, para que você possa arrastar entre o construtor de interface e o seu código, um que a conexão seja estabelecida. importa mais.
Nathan Day
O IBAction também não faz nada no momento da edição, pelo menos na última década. Você também pode conectar um (void)método no Interface Builder.
J. Cocoe
7

O Interface Builder os utiliza para determinar quais membros e mensagens podem ser conectados aos controles da interface que você está usando em sua janela / exibição.

IBOutlet e IBAction estão puramente lá como marcadores que o Interface Builder procura quando analisa seu código em tempo de design; eles não afetam o código gerado pelo compilador.

KazR
fonte
7

Analisou o diagrama enquanto olhava para a codificação de valores-chave, e pensou que isso poderia ajudar alguém. Ajuda a entender o que é o IBOutlet.

Observando o fluxo, foi possível ver que os IBOutlets estão lá apenas para corresponder o nome da propriedade com um nome de controle no arquivo Nib.

Como o arquivo de ponta é carregado, captura de tela do livro on-line de Matt para iOS6

NSCoder
fonte
Esta resposta explica por que e como o IBOutlets funciona, não apenas o que eles fazem .
Jeffery Opoku-Mensah
4

Uma saída é um link do código para a interface do usuário. Se você deseja mostrar ou ocultar um elemento da interface do usuário, se deseja obter o texto de um campo de texto ou ativar ou desativar um elemento (ou centenas de outras coisas), é necessário definir uma saída desse objeto nas fontes e vincular essa saída através do "objeto de interface" para o elemento da interface do usuário. Depois disso, você pode usar a tomada como qualquer outra variável na sua codificação.

IBAction - um método especial acionado por objetos da interface do usuário. O Interface Builder os reconhece.

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

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

Para mais informações, consulte Apple Docs.

पवन
fonte
Uhm, não, não é isso que é um IBOutlet. Onde arranjaste essa ideia?
Richard J. Ross III
3

IBAction e IBOutlets são usados ​​para conectar sua interface feita no Interface Builder ao seu controlador. Se você não usar o Interface Builder e construir sua interface completamente em código, poderá criar um programa sem usá-los. Mas, na realidade, a maioria de nós usa o Interface Builder, uma vez que você deseja obter alguma interatividade em sua interface, precisará usar IBActions e IBoutlets.

Yannick Compernol
fonte
2

IBOutlet

  • É uma propriedade .
  • Quando o arquivo nib (IB) é carregado, ele se torna parte dos dados encapsulados que se conectam a uma variável de instância.
  • Cada conexão é desarquivada e restabelecida.

IBAction

  • O atributo indica que o método é uma ação à qual você pode se conectar a partir do seu storyboard no Interface Builder.

@ - Padrão dinâmico IB - Interface Builder

Vinoth Anandan
fonte
2

Um dos principais comentários sobre esta pergunta pergunta especificamente:

Todas as respostas mencionam o mesmo tipo de idéia. Mas ninguém explica por que o Interface Builder parece funcionar da mesma maneira se você NÃO incluir o IBAction / IBOutlet em sua fonte. Existe outro motivo para o IBAction e o IBOutlet ou está correto deixá-los de fora?


Esta pergunta é respondida bem pelo NSHipster:

IBAction

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

Já em 2004 (e talvez antes), o IBAction não era mais necessário para que um método fosse percebido pelo Interface Builder. Qualquer método com a assinatura -(void){name}:(id)senderseria visível no painel de saídas.

No entanto, muitos desenvolvedores acham útil ainda usar o tipo de retorno IBAction nas declarações do método para indicar que um método específico está conectado por uma ação. Mesmo projetos que não usam Storyboards / XIBs podem optar por empregar o IBAction para chamar métodos de destino / ação.

IBOutlet:

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

Ao contrário do IBAction, o IBOutlet ainda é necessário para conectar propriedades no código a objetos em um Storyboard ou XIB.

Uma conexão IBOutlet geralmente é estabelecida entre uma visualização ou controle e seu controlador de visualização de gerenciamento (isso geralmente é feito além de quaisquer IBActions que um controlador de visualização possa ter como destino executar por um respondedor). No entanto, um IBOutlet também pode ser usado para expor uma propriedade de nível superior, como outro controlador ou uma propriedade que pode ser acessada por um controlador de exibição de referência.

pkamb
fonte
1

Quando você usa o Interface Builder, pode usar o Connections Inspector para configurar os eventos com manipuladores de eventos, os manipuladores de eventos devem ser as funções que possuem o modificador IBAction. Uma visualização pode ser vinculada à referência para o mesmo tipo e ao modificador IBOutlet.

Zephyr
fonte