Передача пользовательских данных в [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
Ответы
Ответ 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 для использования со словарем.