Подтвердить что ты не робот

Передача пользовательских данных в [UIButton addTarget]

Как добавить пользовательские данные при указании цели в UIButton?

id data = getSomeData();
[button addTarget:self 
           action:@selector(buyButtonTapped:event:) 
 forControlEvents:UIControlEventTouchUpInside];

Я хочу, чтобы функция buyButtonTapped выглядела так:

(void) buyButtonTapped: (UIButton *) button event: (id) event data: (id) data
4b9b3361

Ответ 1

невозможно. действие, которое запускается UIControl, может иметь 3 разных подписи.

- (void)action
- (void)action:(id)sender
- (void)action:(id)sender forEvent:(UIEvent *)event

Ни один из них не позволяет отправлять пользовательские данные.


В зависимости от того, что вы хотите сделать, вы можете получить доступ к данным по-разному.

Например, если кнопка находится в UITableView, вы можете использовать что-то вроде этого:

- (IBAction)buttonPressed:(UIButton *)sender {
    CGPoint buttonOriginInTableView = [sender convertPoint:CGPointZero toView:tableView];
    NSIndexPath *indexPath = [tableView indexPathForRowAtPoint:buttonOriginInTableView];
    NSData *customData = [myDataSource customDataForIndexPath:indexPath];
    // do something
}

Всегда есть способ получить данные, не передавая их кнопке.

Ответ 2

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

  • Вы можете использовать свойство tag для хранения одного NSInteger. Это может быть все, что вам нужно, или вы можете использовать его для поиска объекта в массиве или словаре.
  • Вы можете подклассифицировать UIButton для добавления ivars/properties для хранения необходимых данных.
  • Вы можете использовать [NSValue valueWithNonretainedObject:button] в качестве ключа для словаря.
  • Мой личный фаворит для одноразовых, вы можете использовать [ассоциативные ссылки] для связывания объекта данных с кнопкой.

Ответ 3

Вы не можете этого сделать. То, что вы можете сделать, это поместить данные в словарь и использовать кнопку, чтобы получить ее позже.

например.

myDataDict = [NSDictionary dictionaryWithObjectsAndKeys:someData, button, nil];

Затем позже

-(void) buttonPress:(id)sender
{
  data = [dataDict objectForKey:sender];
}

Если ваши кнопки указаны в InterfaceBuilder, вы можете использовать свойство "tag" кнопки для поиска данных, хотя вам нужно будет преобразовать его в NSNumber для использования со словарем.