ビューでユーザー入力を受け取り、それをそのビューのコントローラーに転送する適切な方法は何ですか? NotificationCenter が 1 つのオプションであることは知っていますが、ビューからそのコントローラーにデータを転送するためのよりエレガントな方法は確かにありますか?
すべての助けに大歓迎です。私はいつでも答えを受け入れます!
ビューでユーザー入力を受け取り、それをそのビューのコントローラーに転送する適切な方法は何ですか? NotificationCenter が 1 つのオプションであることは知っていますが、ビューからそのコントローラーにデータを転送するためのよりエレガントな方法は確かにありますか?
すべての助けに大歓迎です。私はいつでも答えを受け入れます!
デリゲート プロトコル デザイン パターン、またはサブクラス化によるターゲット アクションを使用しますUIControl
。UIButton
aが押されたことをView Controllerに伝える方法を考えてみてください。インターフェイス ビルダーでは、アクション (セレクターのようなもの)touchUpInside:
をターゲット (それを所有するビュー コントローラー) に接続します。非 IB では、UIButton
どのセレクターとどのターゲットを使用するかを直接伝えます。
どちらの方法も、さまざまな場合に意味があります。たとえば、UITextField
の場合、委譲を使用する方が理にかなっています。テキスト フィールドは、ユーザーが編集を開始したとき、編集を終了したとき、または文字を入力したときのイベントなど、任意の数のイベントを送信できるからです。
ボタンの場合、さまざまな形式で表現されるイベントが実際には 1 つしかないため、target-action を使用する方が理にかなっています。
スワイプやドラッグ、その他のジェスチャには、UIGestureRecognizer
s を使用します。
コントローラーが自身をビューのデリゲートとして設定するdelegationを探しています。UITableViewDelegate からわかります。
Delegation
またはを探していますData Source
。詳細については、委任とデータ ソースを参照してください。
これの簡単な例は、次のようなものです。
//MyViewSubclass.h
@protocol MyViewSubclassDelegate
//Implement your delegate methods here.
-(void)didTouchView;
@end
@interface MyViewSubclass {
id<MyViewSubclassDelegate>delegate;
}
@property(nonatomic,assign)id<MyViewSubclassDelegate>delegate;
もちろん、@synthesize
あなたdelegate
のMyViewSubclass.m
デリゲートを作成するクラスのヘッダーでMyViewSubclass
、「MyViewSubclassDelegate プロトコル」に準拠する必要があります。
#import "MyViewSubclass.h"
@interface MyViewController : UIViewController <MyViewSubclassDelegate>
@implementation
ofで、 のメソッドをMyViewController.
実装します。MyViewSubclassDelegate
-(void)didTouchView
MyViewSubclass
オブジェクトを初期化して作成するときMyViewController
は、デリゲートとして設定します。
myViewSubclass.delegate = self // Self being MyViewController.
で、MyViewSubclass
情報を転送する準備ができたとき、または単にメソッドを起動したいとき[self.delegate didTouchView]
お役に立てれば !
ビューをサブクラスにUIControl
して、ターゲット/アクション デザイン パターンを実装 sendActionsForControlEvents:
します。メソッドを使用してコントローラーにメッセージを送信します。
多くの場合、UIKit オブジェクトUITextField
には、ビジネス ロジックを実行するために実装できるデリゲート メソッドがあります。たとえば、UITextField には- textFieldDidEndEditing:
、ユーザーがキーボードを閉じた後に呼び出されるデリゲート メソッドがあります。