5

別のクラスから @selector メソッドを呼び出すことは可能ですか? たとえば、「bannerTapped:」メソッドを作成し、「myViewController.m」クラスから呼び出します。

myviewcontroller.m :

anotherClass *ac= [[anotherClass alloc]init];

UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc]initWithTarget:ac action:@selector(bannerTapped:)];
singleTap.numberOfTapsRequired = 1;
singleTap.numberOfTouchesRequired = 1;
cell.conversationImageView.tag = indexPath.row;
[cell.conversationImageView addGestureRecognizer:singleTap];
[cell.conversationImageView setUserInteractionEnabled:YES];

anotherClass.m :

-(void)bannerTapped:(UIGestureRecognizer *)gestureRecognizer {
    //do something here 
}

更新:

viewController.m:

 #import "anotherClass.h"



 +(viewcontroller *)myMethod{
 // some code...

 anotherClass *ac= [[anotherClass alloc]init];

    UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc]initWithTarget:ac   action:@selector(bannerTapped:)];

}

anotherClass.h:

-(void)bannerTapped:(UIGestureRecognizer *)gestureRecognizer;

anotherClass.m:

-(void)Viewdidload{
    [viewController myMethod];
     }


   -(void)bannerTapped:(UIGestureRecognizer *)gestureRecognizer {
      //do something here 
   }
4

4 に答える 4

6

はい、このように

initWithTarget:anotherClassInstance action:@selector(bannerTapped:)];

Target、イベントの送信先のクラス インスタンスです。

編集

質問は、質問したよりもはるかに複雑であるため、今後すべてのコードを投稿することを学んでください。簡単に言えば、これを行うことはできません。

+(viewcontroller *)myMethod{

   anotherClass *ac= [[anotherClass alloc]init];

   UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc]initWithTarget:ac   action:@selector(bannerTapped:)];

}

このメソッドが終了acするとすぐに、作成されたスコープがなくなるため、メモリから解放されます。ここでは使用しARCても違いはありません。

ここでいくつかの異なることを理解する必要があります。

  • +(void)acこれをクラスメソッドにします。つまり、ある意味でしようとしているインスタンス変数を作成することはできませんが、それでも間違った場所に作成しています。
  • ac現在ナビゲーションスタックにあるviewControllerを指していると思われます(コードに基づいて推測するだけです) 。acそのクラスの真新しいコピーです。どこにも表示されず、どこにも使用されず、そのメソッドが終了するとすぐに死ぬ新しいコピーを作成しました。

私の最初のコードは、あなたが尋ねた質問に答えます。つまり、別のクラスからセレクターを呼び出す方法です。あなたの問題は、オブジェクト、メモリ管理、クラス インスタンス、クラス メソッドとインスタンス メソッドのフローを理解していないことです。

Objective-C とオブジェクト指向プログラミングをもっと勉強して、もう一度やってみてください。

于 2014-02-13T15:22:29.453 に答える
1

はい、ターゲットパラメータを

[[UITapGestureRecognizer alloc]initWithTarget: action:];

セレクターを実行するクラスを指定します。覚えておくべきことは、anotherClass を割り当てる必要があり、強い参照を保持する必要があるということです。したがって、最良の方法はプロパティを作成することです:

@property (nonatomic, strong) anotherClass *myClass;

また、クラスをジェスチャ認識エンジンに渡す前に、クラスが割り当てられていることを確認してください。次に例を示します。

self.myClass = [[anotherClass alloc[init];
UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc]initWithTarget:self.myClass action:@selector(bannerTapped:)];
//...
于 2014-02-13T15:26:48.913 に答える
1

次の行で:

UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc]initWithTarget:myViewcontroller action:@selector(bannerTapped:)];

ターゲットとして指定するものは何でも、bannerTapped:セレクターが呼び出されるオブジェクトです。anotherClassそのため、そのパラメーターにのインスタンスを指定するだけで済みます。ほとんどの場合、レコグナイザーを追加するビューを含むビュー コントローラーをターゲットにしますが、これは必須ではありません。

于 2014-02-13T15:23:19.460 に答える