как вызвать метод @ selector из другого класса


Можно ли вызвать методы @ selector из другого класса ? например, я делаю метод " bannerTapped: "и вызываю его из" myViewController.m-класс.

Myviewcontroller.М:

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];

Еще один класс.М:

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

Обновлено :

ViewController.М:

 #import "anotherClass.h"



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

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

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

}

Еще один класс.h:

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

Еще один класс.М:

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


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

3 ответа:

Да, вот так

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

Target - это экземпляр класса, в который вы хотите отправить событие.

EDIT

Пожалуйста, научитесь публиковать весь свой код в будущем, поскольку ваш вопрос намного сложнее, чем вы его задали. Короче говоря, вы не можете этого сделать:

+(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 и объектно-ориентированное программирование подробнее и попробуйте это снова.

В следующей строке:

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

Все, что вы укажете в качестве цели, является объектом, на который будет вызван селектор bannerTapped:. Поэтому вам просто нужно указать экземпляр anotherClass в этом параметре. Большую часть времени люди будут иметь целью контроллер вида, который содержит вид, к которому они добавляют распознаватель, но это не обязательно.

Да вы можете целевой параметр из

[[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:)];
//...