Выполнить действие над кнопкой в UITableView

#iphone #uitableview #uibutton

#iPhone #uitableview #uibutton

Вопрос:

У меня есть UIButton в UITableViewCell… Я хочу выполнить действие с UIButton..

Мне нужно отправить данные в метод @selector, который зарегистрирован для этой кнопки, чтобы я мог выполнять действия, когда пользователь нажимает эту кнопку.

Как это сделать, хотя я обнаружил, что (id) sender параметр внутри функции выбора не всегда является исходной кнопкой, созданной в cellForRowAtIndexPath функции.

Внутри cellForRowAtIndexPath функции:

 UIImage* pdfImage = [UIImage imageNamed:@"icon_pdf.png"];
UIButton* pdfButton = [UIButton buttonWithType:UIButtonTypeCustom];
[pdfButton setImage:pdfImage forState:UIControlStateNormal];
pdfButton.accessibilityHint = @"path/to/pdf/file";
pdfButton.frame = CGRectMake(0, 0, 40, 40);
[pdfButton addTarget:self action:@selector(openUrlInBrowser:) forControlEvents:UIControlEventTouchUpInside];
cell.accessoryView = pdfButton;
  

Вот функция отправителя:

 -(void) openUrlInBrowser:(id)sender
{
    NSLog(@"%@", [sender class]);
    NSString * url=[sender accessibilityHint];
    NSLog(@"%@",url);
    NSLog(@"%@",sender);
    [[UIApplication sharedApplication]openURL:[NSURL URLWithString:url]];
}
  

Комментарии:

1. Вы хотите, чтобы эта кнопка занимала всю ячейку?

2. Это помогло бы увидеть результаты этих операторов NSLog. И остальная часть вашего метода cellForRowAtIndexPath.

Ответ №1:

Надеюсь, я правильно понял вопрос — я обычно определяю тег на кнопке, добавленной в uitableview, который является индексом строки. В cellForRowAtIndexPath :

 [button setTag:indexPath.row];
  

Затем вы можете вернуть его обратно в целевой метод :

 - (void) showdatabases:(id) sender {
int row = [[sender valueForKey:@"tag"] intValue];
...
  

И запросить значения в ячейке для вашей обработки с помощью :

 UITableViewCell* cell = [self.tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:row inSection:0]];
  

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

Ответ №2:

Я предпочитаю использовать:

 -(void) openUrlInBrowser:(id)sender
{
  UIButton * button = (UIButton *)sender;
  NSString * url=[button.superview accessibilityHint];
  [[UIApplication sharedApplication]openURL:[NSURL URLWithString:url]];
}
  

это не зависит от положения ячейки в таблице

Комментарии:

1. хорошо с вашим кодом, все понятно! Я добавил другое решение