我想为每个创建的按钮引发不同的方法。 我尝试在viewDidLoad中调用“FirstImage”方法,但它不起作用。
我在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
我再次编辑了这篇文章,没有更多的错误。 特别感谢大家。我花了很长时间才明白:)
答案 0 :(得分:22)
您必须按如下方式使用@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];
另外,我想补充说使用大写字母表示方法是一种非常糟糕的做法。
答案 1 :(得分:3)
你应该使用
- (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。
答案 2 :(得分:0)
使用
[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
这种方法。
答案 3 :(得分:0)
更改方法文字,如下所示
- (void)createFirstButton: (NSString *)myName withAction: (SEL)myAction
对于声明和定义。
为什么你宣布与公共和私人相同的方法?
答案 4 :(得分:0)
如果要将string作为方法名称传递给selector,请使用NSSelectorFromString。字符串应以&#39;结尾:&#39;实施例 -
NSString *myName=@"aMethod:";
[button addTarget:self
action:NSSelectorFromString(myName)
forControlEvents:UIControlEventTouchDown];