8

わかりました、私は Objective-C でプログラミングし、Xcode を使用しています。私はAppleのWebサイトのドキュメントを読み、デリゲートとは何かを理解しましたが、実際にデリゲートメソッドをコードに実装する方法について話している部分になると、特に「デリゲートのメソッドを実装するようになりました」方法。" 私だけかもしれませんが、メソッドを実装する場所が正確にはわかりません (ViewController と AppDelegate クラスしかない単純な状況では、AppDelegate.h/.m ファイルが正しい場所でしょうか?)。私が学ぶための最良の方法は、非常に単純な例を見ることだと思います。

以下にいくつかのコードがありますが、誰かがデリゲートを 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
4

2 に答える 2

11

あなたが投稿したコードの詳細な分析には立ち入りません—あなたが得ることができる最も有用な応答は、特定のコードサンプルを超越する一般原則に関する限り、ある方向性です。ここに一般的な原則があります...

  • デリゲートは、特定のイベントまたはアクションを処理または応答するためにオブジェクトが(一般的に)呼び出されるオブジェクトです。
  • デリゲートになりたいことをデリゲートを受け入れるオブジェクトに「伝える」必要があります。これは、コードを呼び出す[object setDelegate:self];か設定object.delegate = self;することによって行われます。
  • デリゲートとして機能するオブジェクトは、指定されたデリゲートメソッドを実装する必要があります。オブジェクトは、多くの場合、プロトコルで、またはデフォルト/空のメソッドとしてカテゴリを介してNSObjectで、あるいはその両方でメソッドを定義します。(特にObjective-C 2.0がオプションのプロトコルメソッドをサポートするようになった今、正式なプロトコルアプローチはおそらくよりクリーンです。)
  • 関連するイベントが発生すると、呼び出し元のオブジェクトは、デリゲートが(を使用して)一致するメソッドを実装しているかどうかを確認し、実装している-respondsToSelector:場合はそのメソッドを呼び出します。デリゲートは、呼び出し元に制御を戻す前に、応答する必要があるすべてのことを実行する制御を持ちます。

作業中の特定の例では、GKPeerPickerControllerdelegateにタイプのオブジェクトを受け入れるという名前のプロパティがあることに注意してくださいid<GKPeerPickerControllerDelegate>。これは、プロトコルidのメソッドを実装する(NSObjectの任意のサブクラス)を意味します。次に、 GKPeerPickerControllerDelegateは、いくつかのデリゲートメソッドを定義し、それらがいつ呼び出されるかを記述します。これらのメソッドの1つ以上を実装し(ドキュメントにはすべてオプションであると記載されていますが、2つが必要です)、デリゲートとして登録すると、それらのメソッドが呼び出されます。(.hファイルでメソッドのプロトタイプを宣言する必要はありません。プロトコルヘッダーをインポートして、.mファイルにメソッドを実装するだけです。GKPeerPickerControllerDelegate

于 2009-06-27T05:24:31.397 に答える
1

ObjC と iPhone の開発を学んでいます。デリゲートとその使い方を完全に理解しているとまでは言えません。Apple サイトのデベロッパー ポータルにあるYour First iPhone Applicationでは、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私が理解している限り、重要なことは、デリゲート メソッドを実装するクラスが何であれ、そのクラスはその特定のデリゲートのプロトコルに従う必要があるということです (プロトコル名を、継承するクラスの名前のすぐ横に山かっこで囲むことによって)から)。

于 2009-06-27T05:58:22.583 に答える