Подтвердить что ты не робот

Селектор как параметр в 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 

Я снова редактировал этот пост, и ошибок больше нет. Особая благодарность всем. Мне потребовалось время, чтобы понять:)

4b9b3361

Ответ 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];