对于UIButton,如何通过@selector传递多个参数

时间:2013-11-29 07:39:32

标签: ios iphone ios6 uibutton

我需要为单UIButton传递两个动作。

第一个参数成功传递如下:

[imageButton addTarget:self action:@selector(imageClicked:) forControlEvents:UIControlEventTouchUpInside];
imageButton.tag = 1;

但我需要为同一个按钮传递另一个参数:

int secondAction =10;
    [imageButton addTarget:self action:@selector(imageClicked:*secondAction) forControlEvents:UIControlEventTouchUpInside];

任何人都可以帮助如何为单个按钮/选择器传递两个值吗?

4 个答案:

答案 0 :(得分:1)

您可以使用 Objective C Runtime 功能将数据与对象关联为:

第1步:在您的课程中导入此内容:#import <objc/runtime.h>

第2步:将密钥名称改为:static char * kDataAssociationKey = "associated_data_key";

步骤3:将数据与您的对象(例如:按钮)关联为:

NSString *your_data =@"Data which is being associated";
    objc_setAssociatedObject(imageButton,
                             kDataAssociationKey,
                             your_data,
                             OBJC_ASSOCIATION_RETAIN);

第4步:获取方法中的关联数据:

NSString *value  = (NSString *)objc_getAssociatedObject(imageButton, kDataAssociationKey);

希望它对你有所帮助。

答案 1 :(得分:0)

按钮可以接收的一个参数是(id)发送者。这意味着您可以创建一个继承自UIButton的新按钮,该按钮允许您存储其他预期参数。希望这两个片段说明了该做什么。

imageButton.tag = 1;
[imageButton addTarget:self action:@selector(buttonTouchUpInside:) forControlEvents:UIControlEventTouchUpInside];

 - (IBAction) buttonTouchUpInside:(id)sender {

    MyOwnButton *button = (MyOwnButton *)sender; //MyOwnButton inherited from UIButton

        or 


  UIButton *button = (UIButton *) sender;
  //do as you please with imageButton.tag
  NSLog(@"%d",button.tag);

  }

请参阅此链接以获取进一步说明passing-parameters-on-button-actionselector

答案 2 :(得分:0)

每个事件都有一个发件人,可以通过

获取选择器方法
    (void)notify:(NSNotification *)notification {

     id notificationSender = [notification object];
     //do stuff

    }

现在这个发件人实际上是一个实例,其属性可用于获取有关它的信息  现在你可以做的是你可以创建一个类并为它添加一些你希望通过选择器传递的属性,然后使用NSNotificationCenter来广泛地投射你的事件

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(notify:) name:@"Event" object:yourobjectwithattributes];

将它放在要接收事件的类中,并使用选择器

    [[NSNotificationCenter defaultCenter] postNotificationName:@"Event" object:notificationSender];

这是您想要举办活动的地方

答案 3 :(得分:0)

简短回答:你没有。 @selector告诉按钮点击时要调用的方法,而不是它应该传递给方法的参数。

更长的答案:如果你知道什么时候你正在创建按钮的参数是什么,那么你可以像这样包装它:

// In loadView or viewDidLoad or wherever:
[imageButton addTarget:self action:@selector(imageButtonTapped:) forControlEvents:UIControlEventTouchUpInside];

... later ...

- (void)imageButtonTapped:(id)sender
{
    [self doStuffToMyImageWithArgument:10];
}

- (void)doStuffToMyImageWithArgument:(NSInteger)argument
{
    ... do what you gotta do ...

如果您不知道,那么您可能希望将参数保存到某处的变量。

// In your @interface
@property (nonatomic, assign) NSInteger imageStuffArgument;

... later ...

// In loadView or viewDidLoad or wherever:
[imageButton addTarget:self action:@selector(imageButtonTapped:) forControlEvents:UIControlEventTouchUpInside];

... later ...

- (void)respondToWhateverChangesTheArgument
{
    self.imageStuffArgument = 10;
}

... later ...

- (void)imageButtonTapped:(id)sender
{
    [self doStuffToMyImageWithArgument:self.imageStuffArgument];
}

- (void) doStuffToMyImageWithArgument:(NSInteger)argument
{
    ... do what you gotta do ...