2010-11-21 4 views
3

私はこの問題の簡単な例としてこのテストケースを作成しました。デリゲートとプロトコルを正しく実装する

  • AppDelegateがTestViewControllerを初期化し、ウィンドウ
  • に追加TestViewControllerはTestViewにを初期化し、それTestViewにはTestSubViewを初期化し、サブビュー

として追加ビュー

  • せる私の目標は、TestSubViewがデリゲートを介してTestViewControllerのメソッド&変数にアクセスできるようにすることです。この例では、TestSubViewはtouchesBeganまたはtouchesMovedのいずれかを使用してメソッドにアクセスします。

    お願いします。ありがとうございました。

    編集:これ以上のエラーはありませんが、まだ動作しません。私がしたこと:プロトコル定義を別のファイルに移動し、インポートし、割り当てを保持し、ヘッダーの先頭にある@protocol TestDelegate宣言を削除しました。

    私の問題は、TestViewController.mにデリゲートを割り当てないことです

    TestViewController.h

    #import <UIKit/UIKit.h> 
    
    @interface TestViewController : UIViewController <TestDelegate> { 
    
        int number; 
    } 
    
    -(void)assignNumber:(int)value; 
    -(void)displayNumber; 
    
    @property int number; 
    
    @end 
    

    はTestSubView.h

    #import <UIKit/UIKit.h> 
    #import "TestViewController.h" 
    
    
    @interface TestSubView : UIView { 
    
        id<TestDelegate> delegate; 
    } 
    
    @property (nonatomic, retain) id<TestDelegate> delegate; 
    
    @end 
    
    を必要

    @protocol TestDelegate 
    
    -(void)assignNumber:(int)value; 
    -(void)displayNumber; 
    
    @end 
    

    TestViewController.m

    #import "TestViewController.h" 
    #import "TestView.h" 
    
    @implementation TestViewController 
    
    @synthesize number; 
    
    - (void)loadView { 
        TestView *myView = [[TestView alloc] initWithFrame:CGRectMake(0,0,320,480)]; 
        self.view = myView; 
        [myView release]; 
    } 
    
    -(void)assignNumber:(int)value { 
        NSLog(@"Number Assigned"); 
        number = value; 
    } 
    
    -(void)displayNumber { 
        NSLog(@"%i",number); 
    } 
    

    をprotocol.hに移動し、インポート

    TestSubView.m

    #import "TestSubView.h" 
    #import "TestViewController.h" 
    
    @implementation TestSubView 
    
    @synthesize delegate; 
    
    - (id)initWithFrame:(CGRect)frame { 
        if ((self = [super initWithFrame:frame])) { 
         // Initialization code 
         [self setBackgroundColor:[UIColor redColor]]; 
         [self setUserInteractionEnabled:YES]; 
        } 
        return self; 
    } 
    
    
    - (void)dealloc { 
        [super dealloc]; 
    } 
    
    - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    
        [self.delegate assignNumber:5]; 
    } 
    
    - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { 
    
        [self.delegate displayNumber]; 
    } 
    
  • +0

    :これで終わるために

    myView.delegate = self;


    あなたは次の行にそれを行うだろうプロトコルに準拠したクラスで実行されます。 (実際には、これを変更しないと、後で不一致エラーが発生するので、これは避けるべきです)。なぜ、 'assignNumber:'がなぜですか?私はプロトコルのプロパティを宣言することをお勧めします。 –

    +0

    TestViewクラスを追加できますか?それはあなたの問題がどこにあるのか分かりません。 – Rudiger

    +0

    はTestSubViewがTestViewであることを意味しますか? – Ben

    答えて

    0

    まず第一に、あなたはプロトコルを宣言しているし、そのプロトコルを実装と同じオブジェクトを割り当てます。あなたが探しているのは、あなたのTestSubViewでTestDelegateプロトコルを宣言することです。また、デリゲートのプロパティを設定するときは、必ず 'retain'キーワードとは違って 'assign'キーワードを使用してください。

    最後に、これらのすべては、UIGestureRecognizerを使用することで大幅に簡略化できます。コントローラで設定してtestSubViewに追加することができます。この方法では、ビュー内で対応するジェスチャが境界内で発生したことが認識されると、コントローラにメッセージが送信され、番号を割り当てたり表示したりする必要があります。

    +0

    アドバイスをいただきありがとうございます。私はまだそれを動作させることはできませんでしたが、すべてのエラーを取り除きました。上記の更新。私はGestureRecognizerを見ていきます。 –

    0

    クラスが2つ定義されていない限り、クラスがTestSubViewと呼ばれるときは、TestViewを参照しています。

    TestView *myView = [[TestView alloc] initWithFrame:CGRectMake(0,0,320,480)];

    あなたはまだデリゲートを割り当てていないことが正しいです。あなたは、プロトコルのメソッドを宣言するとき、あなたは再びそれらのメソッドを宣言する必要はありません

    - (void)loadView { 
        TestSubView *myView = [[TestSubView alloc] initWithFrame:CGRectMake(0,0,320,480)]; 
        myView.delegate = self; // Set Delegate Here 
        self.view = myView; 
        [myView release]; 
    } 
    
    関連する問題