13

我想为每个创建的按钮提出不同的方法。我尝试在 viewDidLoad 中调用“FirstImage”方法,但它不起作用。

ViewDidLoad 中的选择器有问题。无法识别“FirstImage”,这是一个没有参数的 void 方法。

视图控制器.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”):

视图控制器.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

视图控制器.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 

我再次编辑了这篇文章,没有更多的错误。特别感谢大家。我花了一些时间来理解:)

4

5 回答 5

23

你必须使用@selector如下

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

那么你的签名是错误的,因为SEL不应该是一个指针。

改变

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

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

finallymyAction有类型SEL所以可以直接传给UIButton方法,如下

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

另外,我想补充一点,对方法使用大写名称是一种非常糟糕的做法。

于 2012-12-29T16:48:27.180 回答
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。

于 2012-12-29T16:50:16.747 回答
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这个方法。

于 2012-12-29T16:50:41.100 回答
0

更改方法文字,如下所示

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

对于声明和定义。

还有为什么你声明了与公共和私有相同的方法?

于 2012-12-29T18:51:01.633 回答
0

如果您希望将字符串作为方法名称传递给选择器,请使用 NSSelectorFromString。字符串应以 ':' 结尾示例-

    NSString *myName=@"aMethod:"; 
    [button addTarget:self 
               action:NSSelectorFromString(myName)
     forControlEvents:UIControlEventTouchDown];
于 2014-03-13T08:06:15.293 回答