我想将变量传递给UIButton操作,例如
NSString *string=@"one";
[downbutton addTarget:self action:@selector(action1:string)
forControlEvents:UIControlEventTouchUpInside];
我的动作功能如下:
-(void) action1:(NSString *)string{
}
但是,它会返回语法错误。 如何将变量传递给UIButton操作?
答案 0 :(得分:21)
将其更改为:
[downbutton addTarget:self action:@selector(action1:) forControlEvents:UIControlEventTouchUpInside];
我不知道Iphone SDK,但按钮操作的目标可能会收到一个id(通常名为sender)。
- (void) buttonPress:(id)sender;
在方法调用中,发件人应该是您案例中的按钮,允许您读取其名称,标签等属性。
答案 1 :(得分: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应该是NSInteger
而不是NSInteger *
答案 2 :(得分:6)
您可以使用associative references向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);
...
}
答案 3 :(得分:5)
传递变量的另一个选项,我觉得它比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
}
答案 4 :(得分:1)
我发现这样做的唯一方法是在调用动作之前设置一个实例变量
答案 5 :(得分: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
答案 6 :(得分: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
}
}
答案 7 :(得分: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]);
}