Как передать переменную в действие UIButton
Я хочу передать переменную в действие UIButton, например
NSString *[email protected]"one";
[downbutton addTarget:self action:@selector(action1:string)
forControlEvents:UIControlEventTouchUpInside];
и моя функция действия выглядит так:
-(void) action1:(NSString *)string{
}
Тем не менее, он возвращает синтаксическую ошибку. Как передать переменную в действие UIButton?
Ответы
Ответ 1
Измените его следующим образом:
[downbutton addTarget:self action:@selector(action1:) forControlEvents:UIControlEventTouchUpInside];
Я не знаю о SDK Iphone, но цель действия кнопки, вероятно, получает идентификатор (обычно называемый отправителем).
- (void) buttonPress:(id)sender;
Внутри вызова метода отправитель должен быть кнопкой в вашем случае, позволяя вам читать такие свойства, как имя, тег и т.д.
Ответ 2
Если вам нужно различать несколько кнопок, вы можете пометить свои кнопки такими тегами, как это:
[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 ..
}
//...
}
UPDATE: sender.tag должен быть NSInteger
вместо NSInteger *
Ответ 3
Вы можете использовать ассоциативные ссылки для добавления произвольных данных в ваш 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);
...
}
Ответ 4
Другая опция для передачи переменных, которую я считаю более прямыми, чем тег из ответа 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
}
Ответ 5
Единственный способ, которым я нашел это, - установить переменную экземпляра перед вызовом действия
Ответ 6
Вы можете расширить 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
Ответ 7
Вы можете установить тег кнопки и получить доступ к нему от отправителя в действии
[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
}
}
Ответ 8
Вы можете использовать строки UIControlStates, которые вы используете:
NSString *[email protected]"one";
[downbutton setTitle:string forState:UIControlStateApplication];
[downbutton addTarget:self action:@selector(action1:) forControlEvents:UIControlEventTouchUpInside];
и функция действия:
-(void)action1:(UIButton*)sender{
NSLog(@"My string: %@",[sender titleForState:UIControlStateApplication]);
}