4

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

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

Да, как этот

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

The 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 - это совершенно новая копия этого класса. Вы создали новую копию, которая нигде не отображается или не используется где-либо, и умирает, как только этот метод завершается.

Мой первый фрагмент кода отвечает на заданный вами вопрос, так вы называете селектор другого класса. Ваша проблема в том, что вы не понимаете поток объектов, управление памятью, экземпляры классов и методы класса против методов экземпляра.

Пожалуйста, изучите объектно-ориентированное и объектно-ориентированное программирование и попробуйте еще раз.

+0

я сделал. и теперь он показывает мне предупреждение uneclared selector "bannerTapped – user3266009

+1

@ user3266009 вы объявили bannerTapped в .h файле этого класса и импортировали его в свой viewController? –

+0

Я только что объявил метод bannerTapped в .h класса viewController, но мое приложение получает сбой, который теперь вызвал ошибку «непризнанный селектор, отправленный на экземпляр». – user3266009

1

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

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

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

+0

Не забудьте импортировать соответствующий контроллер вида. – Desdenova

1

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

[[UITapGestureRecognizer alloc]initWithTarget: action:]; 

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

@property (nonatomic, strong) anotherClass *myClass; 

И убедитесь, что класс выделяется, прежде чем передать его жест распознавани, например:

self.myClass = [[anotherClass alloc[init]; 
UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc]initWithTarget:self.myClass action:@selector(bannerTapped:)]; 
//... 
+0

его давая мне предупреждение «необъявленный селектор» bannerTapped «...... – user3266009

+0

и я не создавали свойство, я только что создал экземпляр« другого класса »и передал его экземпляр в целевом .but его все еще показывает предупреждение – user3266009

+0

Добавьте это к файлу anotherClass.h - (void) bannerTapped: (UIGestureRecognizer *) gestureRecognizer, он должен удалить предупреждение. – Greg

Смежные вопросы