Как передать параметр по нажатию кнопки в Objective C? - PullRequest
2 голосов
/ 10 августа 2011

Поэтому я пытаюсь передать параметры моей функции "buttonClicked", чтобы я мог динамически контролировать, что происходит, когда вы нажимаете кнопку. Каждый способ, которым я пытаюсь сделать это самостоятельно, просто нарушает мой код. Я искал много разных сайтов и ответов на stackOverflow, но я не могу найти ответ. Я довольно плохо знаком с задачей C, особенно с функциями, поэтому я мог бы действительно использовать некоторую помощь, чтобы выяснить, как это сделать. Заранее спасибо

Вот мой код и то, что я пытаюсь сделать:

UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
NSLog(@"Hi 1!");

[button addTarget:self action:@selector(buttonClicked:buttonType:buttonID:) forControlEvents:UIControlEventTouchUpInside];

button.frame = CGRectMake(buttonViewXvalue, buttonViewYvalue, buttonViewWidth, buttonViewLength);

[self.view addSubview:button];  

Тогда объявление в заголовочном файле:

- (IBAction)buttonClicked:(id)sender theButtonType: (int)buttonType: theButtonID: (int) buttonID;

и реализация:

- (IBAction)buttonClicked:(id)sender theButtonType: (int)buttonType: theButtonID: (int)    buttonID 
{
//Here I would use the buttonType and buttonID to create a new view. 
NSLog(@"Hi!");

}

Ответы [ 4 ]

8 голосов
/ 10 августа 2011

Нельзя использовать многопараметрические методы с addTarget:action:forControlEvents:.Вместо этого вы можете установить кнопку tag, а затем искать информацию на основе тега.

2 голосов
/ 10 августа 2011

Действие, которое вы добавляете в UIButton (или любой другой UIControl в этом отношении), должно иметь подпись типа (void)actionName или (void)actionName:(id)sender;, как определено target-action шаблон проектирования.Это дает вам два простых решения.Во-первых, каждая из ваших кнопок вызывает разные (void)actionName -подобные методы, которые затем вызывают более сложные методы для self и передают необходимые параметры.Другой способ - присвоить каждой из ваших кнопок свойство тега и заставить их вызывать (void)actionName:(id)sender -подобный метод (все они могут вызывать один и тот же), а затем вызывать правильный метод с правильными параметрами в зависимости от этого тега:

- (void)actionName:(UIButton)sender;
{
    if (sender.tag == 1) {
        [self firstMethodWithString:someString andNumber:someNumber];
    } else if (sender.tag == 2) {
        [self secondMethodWithArray:someArray dictionary:someDictionary andColor:someColor];
    } // and so on
}

Обратите внимание, как я изменил отправителя с id на UIButton здесь.Это позволяет вам вызывать тег без приведения и не получать предупреждение компилятора, потому что компилятор знает, что вы ожидаете, что только экземпляры UIButton вызовут этот метод.

1 голос
/ 10 августа 2011

Если вы действительно хотите, вы можете создать отдельный обратный вызов для каждой кнопки, например:

// In your Whatever.h file
- (IBOutlet)actionButton1:(UIButton *)sender;
- (IBOutlet)actionButton2:(UIButton *)sender;

// In your Whatever.m file
- (IBOutlet)actionButton1:(UIButton *)sender
{
  // do button 1 specific stuff
}

- (IBOutlet)actionButton2:(UIButton *)sender
{
  // do button 2 specific stuff
}
// etc you get the idea

Затем из Интерфейсного Разработчика посмотрите на свой файл Whever.xib.Вы можете связать «Отправленное событие» (перетаскивание из правого столбца) «Touch Up Inside» с любым из указанных выше действий, которые появятся в «Владельце файла» (левый столбец, когда вы отпустите перетаскивание).Вы можете сделать разные для каждой кнопки.

Следует отметить, что, как правило, если это варианты одной и той же функциональности, имеет смысл использовать свойство tag UIButton.

0 голосов
/ 05 декабря 2014

Я решил эту проблему с массивом объектов: все параметры сохраняются в одном объекте, затем объект вставляется в массив, и, наконец, индекс объекта в массиве передается в свойстве TAG объектакнопка.Эта техника работает для одной или нескольких кнопок.Я сделал это для приложения, у которого был список контактов, где вы могли принимать или отклонять их с помощью кнопок, и эти кнопки вызывали один и тот же метод действия, благодаря TAG стало возможным узнать, какие параметры отправляются в базу данных.Шаги:

1- Создайте новый класс: Новый файл, класс Objective-C, назовите его, подкласс NSOBJECT, сохраните его.

2- В заголовке этого нового класса объявите одинсвойство для каждого параметра.

3- Теперь перейдите к файлу IMPLEMENTATION класса viewcontroller, к которому принадлежит ваша кнопка.

4- Импортируйте новый класс: #import "new_class.h"

5- Объявите массив в разделе INTERFACE:

@interface my_viewcontroller ()
{ NSMutableArray * my_array; }

6- В методе VIEWDIDLOAD создайте массив как пустой:

my_array = [ [ NSMutableArray alloc ] initWithObjects : nil ];

7- Inметод, в котором вы получаете данные для параметров, объявляете объект нового класса, создаете его экземпляр и заполняете свойства:

new_class * nc;
nc = [ [ new_class alloc ] init ];
nc.param1 = @"abc";
nc.param2 = 123;
nc.param3 = true;

8 - Теперь вставьте его в массив:

[ my_array addObject : nc ];

9 - сохранить значение 0 в теге кнопки.Вы будете использовать это значение в качестве индекса для доступа к параметрам в позиции my_array [0].

Если есть еще кнопки, например, из веб-службы, которая возвращает данные JSON, просто выполните цикл по данным, создавая большеэкземпляры нового класса и вставка их в массив.Позже, например, в табличном представлении с динамическими ячейками и ячейке шаблона с кнопками в методе CELLFORROWATINDEXPATH вы сможете сохранить значение INDEXPATH в TAG каждой кнопки, поэтому эти кнопки получат доступ к своим собственным параметрам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...