Как передать переменную в действие UIButton - PullRequest
15 голосов
/ 04 февраля 2009

Я хочу передать переменную в действие UIButton, например

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

и моя функция действия выглядит так:

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

Однако он возвращает синтаксическую ошибку. Как передать переменную в действие UIButton?

Ответы [ 8 ]

21 голосов
/ 04 февраля 2009

Измените его следующим образом:

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

Я не знаю о Iphone SDK, но цель действия кнопки, вероятно, получает идентификатор (обычно с именем отправителя).

- (void) buttonPress:(id)sender;

В вызове метода отправитель должен быть кнопкой в ​​вашем случае, позволяющей вам прочитать свойства, такие как его имя, тег и т. Д.

18 голосов
/ 14 июня 2010

Если вам необходимо различать несколько кнопок, то вы можете пометить свои кнопки с помощью тегов:

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

6 голосов
/ 02 марта 2012

Вы можете использовать ассоциативные ссылки для добавления произвольных данных в вашу 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);
  ...
}
5 голосов
/ 22 декабря 2013

Другой вариант для передачи переменных, который я считаю более прямым, чем тег из ответа Левиатана, заключается в передаче строки в 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
}
1 голос
/ 23 апреля 2015

Вы можете расширить 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
1 голос
/ 29 мая 2009

Единственный способ сделать это - установить переменную экземпляра перед вызовом действия

0 голосов
/ 21 октября 2015

Вы можете использовать строки 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]);
}
0 голосов
/ 12 сентября 2014

Вы можете установить тег кнопки и получить к нему доступ от отправителя в действии

[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
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...