Как передать переменную в действие UIButton

StackOverflow https://stackoverflow.com/questions/510393

  •  21-08-2019
  •  | 
  •  

Вопрос

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

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

и моя функция действия похожа на:

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

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

Это было полезно?

Решение

Измените его на чтение:

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

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

- (void) buttonPress:(id)sender;

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

Другие советы

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

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

Обновить:отправитель.тег должен быть NSInteger вместо NSInteger *

Вы можете использовать ассоциативные ссылки чтобы добавить произвольные данные в ваш 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);
  ...
}

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

Вы можете установить тег кнопки и получить к ней доступ из sender in action

[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]);
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top