English 中文(简体)
如何将变量传递给UIButton操作
原标题:
  • 时间:2009-02-04 07:26:48
  •  标签:

我想将一个变量传递给UIButton动作,例如

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

我的行动函数是这样的:

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

However, it returns a syntax error. How to pass a variable to a UIButton action?

最佳回答

将其更改为:

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

我不了解 iPhone SDK,但是一个按钮动作的目标概​​率接收一个 id(通常命名为sender)。

- (void) buttonPress:(id)sender;

在方法调用中,发送者应该是您的按钮,允许您读取属性,例如它的名称,标记等。

问题回答

如果你需要区分多个按钮,你可以用类似这样的标签来标记你的按钮:

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

在您的操作Delegate方法中,您可以根据先前设置的标签处理每个按钮。

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

更新:sender.tag应该是一个NSInteger而不是一个NSInteger *。

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

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

For the policy field (OBJC_ASSOCIATION_RETAIN) specify the appropriate policy for your case. On the action delegate method:

(void) buttonPress:(id)sender {
  NSString *myData =
    (NSString *)objc_getAssociatedObject(sender, &myDataKey);
  ...
}

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

button.accessibilityHint = [user objectId];

然后在按钮的动作方法中:

-(void) someAction:(id) sender {
    UIButton *temp = (UIButton*) sender;
    NSString *variable = temp.accessibilityHint;
    // anything you want to do with this variable
}

我发现唯一的方法是在调用该动作之前设置一个实例变量。

你可以扩展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

你可以为按钮设置标签,并在操作中从发送器中访问它。

[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
    }
}

你可以使用未使用的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]);
}




相关问题
热门标签