16

例如,我想将变量传递给 UIButton 操作

NSString *string=@"one";
[downbutton addTarget:self action:@selector(action1:string)
     forControlEvents:UIControlEventTouchUpInside];

我的动作功能是这样的:

-(void) action1:(NSString *)string{
}

但是,它返回语法错误。如何将变量传递给 UIButton 动作?

4

8 回答 8

21

将其更改为:

[downbutton addTarget:self action:@selector(action1:) forControlEvents:UIControlEventTouchUpInside];

我不了解 Iphone SDK,但按钮操作的目标可能会收到一个 id(通常命名为发件人)。

- (void) buttonPress:(id)sender;

在方法调用中,sender 应该是您案例中的按钮,允许您读取属性,例如它的名称、标签等。

于 2009-02-04T08:28:34.657 回答
18

如果您需要区分多个按钮,则可以使用如下标签标记按钮:

[downbutton addTarget:self action:@selector(buttonPress:) forControlEvents:UIControlEventTouchUpInside];
downButton.tag = 15;

然后,在您的操作委托方法中,您可以根据之前设置的标签处理每个按钮:

(void) buttonPress:(id)sender {
    NSInteger tid = ((UIControl *) sender).tag;
    if (tid == 15) {
        // deal with downButton event here ..
    }
    //...
}

更新: sender.tag 应该是 aNSInteger而不是 aNSInteger *

于 2010-06-14T14:16:09.857 回答
6

您可以使用关联引用将任意数据添加到您的 UIButton:

static char myDataKey;
...
UIButton *myButton = ...
NSString *myData = @"This could be any object type";
objc_setAssociatedObject (myButton, &myDataKey, myData, 
  OBJC_ASSOCIATION_RETAIN);

对于策略字段 (OBJC_ASSOCIATION_RETAIN),请为您的案例指定适当的策略。在动作委托方法上:

(void) buttonPress:(id)sender {
  NSString *myData =
    (NSString *)objc_getAssociatedObject(sender, &myDataKey);
  ...
}
于 2012-03-02T10:20:35.887 回答
6

传递变量的另一个选项,我发现它比 leviatan 的答案中的标记更直接,是在 accessHint 中传递一个字符串。例如:

button.accessibilityHint = [user objectId];

然后在按钮的action方法中:

-(void) someAction:(id) sender {
    UIButton *temp = (UIButton*) sender;
    NSString *variable = temp.accessibilityHint;
    // anything you want to do with this variable
}
于 2013-12-22T12:39:12.793 回答
1

我发现这样做的唯一方法是在调用操作之前设置一个实例变量

于 2009-05-29T13:53:47.517 回答
1

您可以扩展 UIButton 并添加自定义属性

//UIButtonDictionary.h
#import <UIKit/UIKit.h>

@interface UIButtonDictionary : UIButton

@property(nonatomic, strong) NSMutableDictionary* attributes;

@end

//UIButtonDictionary.m
#import "UIButtonDictionary.h"

@implementation UIButtonDictionary
@synthesize attributes;

@end
于 2015-04-23T14:56:23.167 回答
0

您可以设置按钮的标签并从发送者访问它

[btnHome addTarget:self action:@selector(btnMenuClicked:)     forControlEvents:UIControlEventTouchUpInside];
                    btnHome.userInteractionEnabled = YES;
                    btnHome.tag = 123;

在被调用函数中

-(void)btnMenuClicked:(id)sender
{
[sender tag];

    if ([sender tag] == 123) {
        // Do Anything
    }
}
于 2014-09-12T16:42:50.137 回答
0

您可以使用您不使用的 UIControlStates 的字符串:

NSString *string=@"one";
[downbutton setTitle:string forState:UIControlStateApplication];
[downbutton addTarget:self action:@selector(action1:) forControlEvents:UIControlEventTouchUpInside];

和动作功能:

-(void)action1:(UIButton*)sender{
    NSLog(@"My string: %@",[sender titleForState:UIControlStateApplication]);
}
于 2015-10-21T13:22:51.170 回答