selector as parameter in IOS

谁说我不能喝 提交于 2019-12-05 01:26:48

You have to use use @selector as follows

[self createFirstButton:@"First" myAction:@selector(FirstImage)];

Then your signature is wrong, since SEL shouldn't be a pointer.

Change

- (void)createFirstButton:(NSString *)myName: (SEL *)myAction{

to

- (void)createFirstButton:(NSString *)myName: (SEL)myAction{

Finally myAction has type SEL so you can pass it directly to the UIButton method, as follows

[btn addTarget:self
     action:myAction
     forControlEvents:UIControlEventTouchUpInside];

Also, I'd like to add that using capitalized names for methods it's a very bad practice.

You should use

- (void)viewDidLoad{
    [self createFirstButton:@"First" myAction:@selector(FirstImage)];
}

or

- (void)viewDidLoad{
    [self createFirstButton:@"First" myAction:NSSelectorFromString(@"FirstImage")];
}

@selector(myAction) should be replaced with myAction, and (SEL *) should be replaced with SEL.

In your code, before -createFirstButton:myAction: is called, its second parameter [self FirstImage] would be evaluated(called) first. @selector() takes a name and returns a SEL.

Exploring

Change the method literal as in the following

- (void)createFirstButton: (NSString *)myName withAction: (SEL)myAction

For both declaration and definition.

And also why have you declared the same method as a public as well as private?

Anoop Vaidya

Use

[self createFirstButton:@"First" withAction:NSSelectorFromString(@"FirstImage")];

And change the method name as :

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

Also,

I wonder-all buttons having same frame, if possible pass frame this method.

If you are looking to pass string as method name to selector, then use NSSelectorFromString. String should end with ':' Example-

    NSString *myName=@"aMethod:"; 
    [button addTarget:self 
               action:NSSelectorFromString(myName)
     forControlEvents:UIControlEventTouchDown];
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!