Селектор как параметр в IOS
Я хочу поднять другой метод для каждой созданной кнопки.
Я пытаюсь вызвать метод FirstImage в viewDidLoad, но он не работает.
У меня проблема с селектором в ViewDidLoad. Не распознал "FirstImage", который является методом void без параметра.
ViewController.m
- (void)createFirstButton:(NSString *)myName: (SEL *)myAction{
UIButton *btn = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[btn addTarget:self
action:@selector(myAction)
forControlEvents:UIControlEventTouchUpInside];
[btn setTitle:myName forState:UIControlStateNormal];
btn.frame = CGRectMake(20, 916, 120, 68);
[self.view addSubview:btn];
}
- (void)viewDidLoad{
[self createFirstButton:@"First" myAction:[self FirstImage]];
}
Что я сделал (я изменил "CreateFirstButton" на "CreateButton" ):
ViewControler.m
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
@synthesize myHeight;
@synthesize myWidth;
@synthesize myX;
@synthesize myY;
- (void)createButton:(NSString *)myName:(SEL)myAction:(NSUInteger)my_x:(NSUInteger)my_y:(NSUInteger)my_width:(NSUInteger)my_height
{
UIButton *btn = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[btn addTarget:self
action:myAction
forControlEvents:UIControlEventTouchUpInside];
[btn setTitle:myName forState:UIControlStateNormal];
btn.frame = CGRectMake(my_x, my_y, my_width, my_height);
[self.view addSubview:btn];
}
- (void)myXcrementation{
myX = myX + 150;
}
- (void)viewDidLoad{
myX = 20; myY = 916; myWidth = 120; myHeight = 68;
[self createButton:@"First":@selector(FirstImage):myX:myY:myWidth:myHeight];
[self myXcrementation];
[self createButton:@"Previous":@selector(PreviousImage):myX:myY:myWidth:myHeight];
[self myXcrementation];
[self createButton:@"Pause":@selector(PauseImage):myX:myY:myWidth:myHeight];
[self myXcrementation];
[self createButton:@"Next":@selector(NextImage):myX:myY:myWidth:myHeight];
[self myXcrementation];
[self createButton:@"Last":@selector(LastImage):myX:myY:myWidth:myHeight];
}
- (void)FirstImage{
current = 0;
[self SetImage];
}
-(void)SetImage{
[myImageView setImage: [myArray objectAtIndex:(current)]];
}
@end
ViewController.h
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController{
}
@property(assign, nonatomic) NSUInteger myHeight;
@property(assign, nonatomic) NSUInteger myWidth;
@property(assign, nonatomic) NSUInteger myX;
@property(assign, nonatomic) NSUInteger myY;
@end
Я снова редактировал этот пост, и ошибок больше нет.
Особая благодарность всем. Мне потребовалось время, чтобы понять:)
Ответы
Ответ 1
Вам нужно использовать @selector
следующим образом
[self createFirstButton:@"First" myAction:@selector(FirstImage)];
Тогда ваша подпись неверна, поскольку SEL
не должен быть указателем.
Изменить
- (void)createFirstButton:(NSString *)myName: (SEL *)myAction{
к
- (void)createFirstButton:(NSString *)myName: (SEL)myAction{
Наконец myAction
имеет тип SEL
, поэтому вы можете передать его непосредственно методу UIButton
, как показано ниже.
[btn addTarget:self
action:myAction
forControlEvents:UIControlEventTouchUpInside];
Кроме того, я хотел бы добавить, что использование заглавных имен для методов это очень плохая практика.
Ответ 2
Вы должны использовать
- (void)viewDidLoad{
[self createFirstButton:@"First" myAction:@selector(FirstImage)];
}
или
- (void)viewDidLoad{
[self createFirstButton:@"First" myAction:NSSelectorFromString(@"FirstImage")];
}
@selector(myAction)
следует заменить на myAction
, а (SEL *)
следует заменить на SEL
.
В вашем коде, прежде чем -createFirstButton:myAction:
будет вызван, его второй параметр [self FirstImage]
будет сначала оценен (вызван). @selector() принимает имя и возвращает SEL.
Ответ 3
Использование
[self createFirstButton:@"First" withAction:NSSelectorFromString(@"FirstImage")];
И измените имя метода как:
- (void)createFirstButton:(NSString *)myName: withAction: (SEL) myAction{
UIButton *btn = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[btn addTarget:self
action:myAction
forControlEvents:UIControlEventTouchUpInside];
[btn setTitle:myName forState:UIControlStateNormal];
btn.frame = CGRectMake(20, 916, 120, 68);
[self.view addSubview:btn];
}
Кроме того,
Интересно, что все кнопки имеют одинаковый фрейм, если возможно, передают frame
этот метод.
Ответ 4
Измените литерал метода следующим образом
- (void)createFirstButton: (NSString *)myName withAction: (SEL)myAction
Для объявления и определения.
А также почему вы объявили тот же метод, что и общедоступный, а также закрытый?
Ответ 5
Если вы хотите передать строку как имя метода в селектор, используйте NSSelectorFromString. Строка должна заканчиваться символом ':' Пример -
NSString *[email protected]"aMethod:";
[button addTarget:self
action:NSSelectorFromString(myName)
forControlEvents:UIControlEventTouchDown];