単純なデリゲートの例?
-
20-08-2019 - |
質問
さて、私はObjective-Cでプログラミングしており、Xcodeを使用しています。私はAppleのウェブサイトでドキュメントを読んで、代表者が何であるかを理解しましたが、実際に代表的な方法をコードに実装する方法について話す部分に来ると、特に彼らが「今」のようなことを言うとき、私はただ混乱します方法。"たぶんそれは私だけかもしれませんが、メソッドの実装場所が正確にわかりません(appdelegate.h/.mファイルは、viewcontrollerとAppdelegateクラスのみを持っている単純な状況で正しい場所になりますか?)。私にとって本当に最良の学習方法は、非常に単純な例を見ることだと思います。
以下にいくつかのコードがありますが、誰かがデリゲートをViewControllerに接続して合計を表示する方法を教えてくれないかと思いました。コードが長く見えたら申し訳ありませんが、これは私が考えることができる最も単純な委任の例です。議論の便宜と、参照するコードが少なくなるように (何が起こっているのかを理解しやすくするため)、ServerClass *server がサーバーを実装し、ClientClass *client がクライアントを実装するとします。両方ともすでに相互に接続されており、番号の入力を待っています。私は正しいと思うことを書き留めましたが、それが完全ではないことは確かです(デリゲートをサーバーとクライアントの両方に接続する限り)。どこに記述すればよいかわからないのはプロトコル宣言です。そのため、誰かがこの単純な問題を解いてもらえれば、デリゲートがクラスにどのように実装されるかを学ぶ上で非常に役立つでしょう。
ちなみに、私は iPhone SDK 3.0 の新しい GameKit の Peer Picker を使って作業しています。もし誰かが何に何に接続しているのかを教えてほしいと思っています。たとえば、私はここにいます Peer Picker に関する Apple ガイドのステップ 3. 。さて、ステップ 5 がプロジェクトのどこに行くのかわかりません。このデリゲートの実装を理解するのを手伝ってくれたすべての人に感謝します...これまでのところ、みなさんは素晴らしいです!
ExampleAppDelegate.h
#import <UIKit/UIKit.h>
@class ExampleAppViewController;
@interface ExampleAppDelegate : NSObject <UIApplicationDelegate> {
UIWindow *window;
ExampleAppViewController *viewController;
int sum;
}
@property (nonatomic, retain) sum;
@property (nonatomic, retain) IBOutlet UIWindow *window;
@property (nonatomic, retain) IBOutlet ExampleAppViewController *viewController;
-(void) addNum:(int)num;
@end
ExampleAppDelegate.m
#import "ExampleAppDelegate.h"
#import "ExampleAppViewController.h"
@implementation ExampleAppDelegate
@synthesize window;
@synthesize viewController;
- (void)applicationDidFinishLaunching:(UIApplication *)application {
application.idleTimerDisabled = YES;
// Override point for customization after app launch
[window addSubview:viewController.view];
[window makeKeyAndVisible];
}
- (void)dealloc {
[viewController release];
[window release];
[super dealloc];
}
-(void)addNum:(int)num {
sum += num;
}
@end
ExampleAppViewController.h
#import <UIKit/UIKit.h>
#import <GameKit/GameKit.h>
@interface ExampleAppViewcontroller : NSObject {
IBOutlet UILabel *sumField; // will display the total sum, one number entered //by the server and one entered by the client, on both iPhones after calculation
int sum; // the total sum after addition;
ServerClass *server; // some server
ClientClass *client; // some client
int num; // the number to add to sum
}
@property(nonatomic, assign) sum;
@property(nonatomic, retain) num;
-(void) displaySum;
@end
ExampleAppViewController.m
#import "ExampleAppViewcontroller.h"
@implementation ExampleAppViewController
@synthesize sum;
@synthesize num;
-(void) displaySum {
[sumfield setText: @"%i", sum];
}
@end
解決
あなたが投稿したコードの詳細な分析には立ち入りません。あなたが得ることができる最も役立つ応答は、特定のコード サンプルを超えた一般原則に関する何らかの方向性です。一般原則は次のとおりです...
- デリゲートは、特定のイベントまたはアクションを処理または応答するために (一般的に) 呼び出されるオブジェクトです。
- デリゲートを受け入れるオブジェクトに、自分がデリゲートになりたいことを「伝える」必要があります。これは呼び出しによって行われます
[object setDelegate:self];
または設定object.delegate = self;
あなたのコードに。 - デリゲートとして機能するオブジェクトは、指定されたものを実装する必要があります。 デリゲートメソッド. 。オブジェクトは多くの場合、プロトコル内でメソッドを定義するか、デフォルト/空のメソッドとしてカテゴリを介して NSObject 上でメソッドを定義するか、あるいはその両方を定義します。(特に Objective-C 2.0 がオプションのプロトコル メソッドをサポートしているため、正式なプロトコル アプローチの方がおそらくより明確です。)
- 関連するイベントが発生すると、呼び出し側オブジェクトは、デリゲートが一致するメソッドを実装しているかどうかを確認します (
-respondsToSelector:
)、存在する場合はそのメソッドを呼び出します。デリゲートは、呼び出し元に制御を返す前に、応答するために必要なことをすべて実行する制御を持ちます。
あなたが取り組んでいる特定の例では、次のことに注目してください。 GKPeerPickerController という名前のプロパティがあります delegate
型のオブジェクトを受け入れます id<GKPeerPickerControllerDelegate>
. 。これは、 id
(NSObject の任意のサブクラス) のメソッドを実装します。 GKPeerPickerControllerDelegate
プロトコル。 GKPeerPickerControllerDelegate 次に、多数のデリゲート メソッドを定義し、それらがいつ呼び出されるかを説明します。これらのメソッドを 1 つ以上実装し (ドキュメントにはすべてオプションと記載されていますが、2 つが期待されています)、デリゲートとして登録すると、それらのメソッドが呼び出されます。(.h ファイルでメソッドのプロトタイプを宣言する必要はなく、プロトコル ヘッダーをインポートして .m ファイルにメソッドを実装するだけであることに注意してください。
他のヒント
私はにObjCとiPhone開発を勉強しています。私が代表者とその使用は完全に理解していることを言って、私はこれまでのところまで届かないだろう。 Appleのサイトで開発者ポータル上で、具体的にはTextFieldのデリゲートの使用は、TextFieldで編集が行われたときに、キーボードが消えるようにするメソッドをオーバーライドすることができ、非常に簡単な例を通じ歩きます。例えば、私はそこから関連するスニペットを貼り付けることができた場合:
// MyViewController.h
#import <UIKit/UIKit.h>
@interface MyViewController : UIViewController <UITextFieldDelegate> {
UITextField *textField;
UILabel *label;
NSString *string;
}
@property (nonatomic, retain) IBOutlet UITextField *textField;
@property (nonatomic, retain) IBOutlet UILabel *label;
@property (nonatomic, copy) IBOutlet NSString *string;
- (IBAction)changeGreeting:(id)sender;
@end
// MyViewController.m
#import "MyViewController.h"
@implementation MyViewController
@synthesize textField;
@synthesize label;
@synthesize string;
- (BOOL)textFieldShouldReturn:(UITextField *)theTextField {
if (theTextField == textField) {
[textField resignFirstResponder];
}
return YES;
}
@end
ここではオーバー、textFieldShouldReturn
UITextFieldDelegate
プロトコルの一部である方法です。私はそれを理解していると同じくらい、重要なことは、あなたがそのクラス内のデリゲートメソッドを実装する方のクラスというの の(すぐ隣に角括弧で囲まれたプロトコル名を持つことによって、特定のデリゲートのプロトコルに従う必要がありますされますそれが継承するクラスの名前です)。