IBOutletおよびIBAction


159

XcodeおよびInterface BuilderでIBOutletsおよびIBActionsを使用する目的は何ですか?

IBOutletsとIBActionsを使用しない場合、違いはありますか?


迅速:

@IBOutlet weak var textField: UITextField!

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

Objective-C:

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

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

12
すべての回答が同じ種類のアイデアについて言及していますが、ソースにIBAction / IBOutletを含めない場合、Interface Builderが同じように機能するように見える理由は誰にも説明されていません。IBActionとIBOutletには別の理由がありますか、それともそれらをオフのままにしても大丈夫ですか?
bobobobo 2009年

2
以下のMichael Rogersの回答は、IBActionが省略されている場合でもコードが機能する理由についての説明を少し追加しています。
クリシュナ

IBActionsあなたはIBActionは、ここでそのにどのように適合するかについて読むことができ、ターゲット・アクションの相互作用機構の一部として存在します。developer.apple.com/library/ios/documentation/General/... あなたがここにアウトレット上に読むことができます:developer.apple。 com / library / ios / documentation / General /…
William Power

回答:


208

IBActionおよびIBOutletは、Interface Builderで参照できる変数とメソッドを示すために定義されたマクロです。

IBActionに解決しvoidIBOutlet何も解決されますが、彼らはこれらの変数やメソッドXcodeとのインターフェイスにビルダーことを意味は、あなたのコードへのリンクUI要素にインターフェイスビルダーで使用することができます。

Interface Builderをまったく使用しない場合は、コードでそれらを使用する必要はありませんが、それをIBAction使用する場合は、IBで使用されるメソッドとIBOutletオブジェクトに指定する必要があります。 IBで使用されます。


@Jasarien「IBで使用されるメソッドにはIBActionを、IBで使用されるオブジェクトにはIBOutletを指定する必要があります。」違いは何ですか?
シリルチャンピア

3
@nerithメソッドとオブジェクトの間に存在する同じ違い。メソッドのIBActions、オブジェクトのIBOutlet。
Jasarien 2012

明確にするために、私の投稿は編集されているため、にIBOutlet解決されませんid。このことを考えてみましょう:IBOutlet UILabel *nameLabel;-場合IBOutletに解決idし、コードが読みだろうとid UIlabel *namelabel;コンパイルエラーを生成します。最初に述べたように、IBOutlet何にも解決しません。
Jasarien 2012

38

メソッドにフラグを付けてInterface Builderに表示し、接続をドラッグできるようにする従来の方法は、メソッドに戻り型のIBActionを作成することでした。ただし、メソッドをvoidにして(IBActionを#defineしてvoidにして)、(id)引数を指定しても、メソッドは引き続き表示されます。これにより、柔軟性がさらに向上します。

これら3つはすべて、Interface Builderから表示できます。

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

詳細については、AppleのInterface Builder User Guideを参照してください。特に、Xcodeの統合というタイトルのセクションを参照してください。


1
ここで提案され上記ガイドへのリンクです:developer.apple.com/library/ios/recipes/...
アグレッサー

32

GUIコンポーネントにインターフェースビルダー(したがってIBプレフィックス)を使用している場合は、IBOutletおよびIBActionを使用する必要があります。アプリケーションのプロパティをIBのコンポーネントに関連付けるにはIBOutletが必要であり、メソッドをIBのアクションに関連付けるにはIBActionを使用します。

たとえば、ボタンとラベルをIBで定義するとします。ボタンを押してラベルの値を動的に変更するには、次のようなアクションとプロパティをアプリで定義します。

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

次に、IBでmyLabelをラベルに接続し、pushmeメソッドをボタンに接続します。これらの接続がIBに存在するには、IBActionとIBOutletが必要です。


13
しかし、IBOutletラベルを含めなくても機能するのはなぜですか?
bobobobo 2009年

7
これらのマクロはコンパイル時に何もしないため、それらは単にインターフェイスビルドアプリがソースコード内のこれらのメソッドとインターフェイスビルダーファイルを見つけ、インターフェイスビルダーとコードの間をドラッグできるようにするためのものです。もう問題はありません。
ネイサンの日

少なくとも過去10年間、IBActionは編集時にも何もしません。(void)Interface Builderでメソッドを接続することもできます。
J.ココー16

7

Interface Builderはそれらを使用して、ウィンドウ/ビューで使用しているインターフェイスコントロールにどのメンバーとメッセージを「関連付ける」ことができるかを決定します。

IBOutletとIBActionは、設計時にコードを解析するときにInterface Builderが探すマーカーとして純粋に存在し、コンパイラによって生成されるコードに影響を与えません。


7

キーと値のコーディングを見ながら図に出くわし、それが誰かを助けるかもしれないと思った。IBOutletとは何かを理解するのに役立ちます。

フローを見ると、プロパティ名とNibファイルのコントロール名を照合するためにIBOutletが存在するだけであることがわかります。

nibファイルのロード方法、マットのiOS6用オンラインブックのスクリーンショット


この回答は IBOutletが何をするのかではなく、なぜそしてどのように機能する説明しています
Jeffery Opoku-Mensah 2016年

4

アウトレットは、コードからUIへのリンクです。UI要素を表示または非表示にする場合、テキストフィールドのテキストを取得する場合、または要素(またはその他100のもの)を有効または無効にする場合は、ソースでそのオブジェクトのアウトレットを定義し、そのアウトレットをリンクする必要があります。 「インターフェースオブジェクト」を介してUI要素に。その後、コーディングの他の変数と同じようにアウトレットを使用できます。

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とは違う。どこでそのアイデアを得たのですか?
リチャードJ.ロスIII

3

IBActionおよびIBOutletsは、Interface Builderで作成したインターフェイスをコントローラーに接続するために使用されます。Interface Builderを使用せず、完全にコードでインターフェイスを構築する場合は、それらを使用せずにプログラムを作成できます。しかし、実際には、ほとんどの人がInterface Builderを使用しています。インターフェイスでインタラクティブ機能を実現したい場合は、IBActionsとIBoutletを使用する必要があります。


2

IBOutlet

  • これは、あるプロパティ
  • nib(IB)ファイルがロードされると、インスタンス変数に接続するカプセル化されたデータの一部になります。
  • 各接続はアーカイブ解除され、再確立されます。

IBAction

  • 属性は、メソッドがInterface Builderのストーリーボードから接続できるアクションであることを示します。

@-動的パターンIB-インターフェイスビルダー


2

この質問の上位コメントの1つは、具体的に次のように尋ねています。

すべての回答が同じ種類のアイデアについて言及していますが、ソースにIBAction / IBOutletを含めない場合、Interface Builderが同じように機能するように見える理由は誰にも説明されていません。IBActionとIBOutletには別の理由があります、それともそれらをオフのままにしても問題ありませんか?


この質問はNSHipsterによってよく答えられています。

IBAction

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

2004年には(そしておそらく以前にも)、Interface Builderがメソッドに通知するためにIBActionは必要なくなりました。署名付きのメソッドはすべて-(void){name}:(id)senderアウトレットペインに表示されます。

それでも、多くの開発者は、特定のメソッドがアクションによって接続されていることを示すために、メソッド宣言でIBAction戻り値型を引き続き使用すると便利だと感じています。ストーリーボード/ XIBを使用していないプロジェクトでも、IBActionを使用してターゲット/アクションメソッドを呼び出すことができます。

IBOutlet:

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

IBActionとは異なり、IBOutletは引き続き必要です、ストーリーボードまたはXIBのオブジェクトをコードのプロパティに接続するために。

IBOutlet接続は通常、ビューまたはコントロールとその管理ビューコントローラーの間に確立されます(これは、ビューコントローラーがレスポンダによって実行する対象となる可能性があるIBActionに加えて行われることがよくあります)。ただし、IBOutletを使用して、別のコントローラーや、参照しているビューコントローラーからアクセスできるプロパティなどのトップレベルのプロパティを公開することもできます。


1

インターフェイスビルダーを使用する場合、接続インスペクターを使用してイベントハンドラーでイベントを設定できます。イベントハンドラーは、IBAction修飾子を持つ関数であると想定されています。ビューは、同じタイプの参照およびIBOutlet修飾子とリンクできます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.