как вызвать метод @ 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 ответа:
Да, вот так
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:)]; //...