Обнаружение, какая кнопка UIB была нажата в UITableView - PullRequest
209 голосов
/ 26 ноября 2009

У меня есть UITableView с 5 UITableViewCells. Каждая ячейка содержит UIButton, который настроен следующим образом:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
     NSString *identifier = @"identifier";
     UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];
     if (cell == nil) {
         cell = [[UITableView alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier];
         [cell autorelelase];

         UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(10, 5, 40, 20)];
         [button addTarget:self action:@selector(buttonPressedAction:) forControlEvents:UIControlEventTouchUpInside];
         [button setTag:1];
         [cell.contentView addSubview:button];

         [button release];
     }

     UIButton *button = (UIButton *)[cell viewWithTag:1];
     [button setTitle:@"Edit" forState:UIControlStateNormal];

     return cell;
}

Мой вопрос таков: в методе buttonPressedAction: как узнать, какая кнопка была нажата. Я рассмотрел использование тегов, но я не уверен, что это лучший маршрут. Я хотел бы иметь возможность каким-либо образом пометить indexPath на элементе управления.

- (void)buttonPressedAction:(id)sender
{
    UIButton *button = (UIButton *)sender;
    // how do I know which button sent this message?
    // processing button press for this row requires an indexPath. 
}

Какой стандартный способ сделать это?

Edit:

Я вроде решил это следующим образом. Я все еще хотел бы иметь мнение, является ли это стандартным способом сделать это или есть лучший способ?

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
     NSString *identifier = @"identifier";
     UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];
     if (cell == nil) {
         cell = [[UITableView alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier];
         [cell autorelelase];

         UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(10, 5, 40, 20)];
         [button addTarget:self action:@selector(buttonPressedAction:) forControlEvents:UIControlEventTouchUpInside];
         [cell.contentView addSubview:button];

         [button release];
     }

     UIButton *button = (UIButton *)[cell.contentView.subviews objectAtIndex:0];
     [button setTag:indexPath.row];
     [button setTitle:@"Edit" forState:UIControlStateNormal];

     return cell;
}

- (void)buttonPressedAction:(id)sender
{
    UIButton *button = (UIButton *)sender;
    int row = button.tag;
}

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

Ответы [ 26 ]

0 голосов
/ 23 апреля 2010

Я что-то упустил? Разве вы не можете просто использовать отправителя для идентификации кнопки. Отправитель предоставит вам такую ​​информацию:

<UIButton: 0x4b95c10; frame = (246 26; 30 30); opaque = NO; tag = 104; layer = <CALayer: 0x4b95be0>>

Тогда, если вы хотите изменить свойства кнопки, произнесите фоновое изображение, которое вы только что сказали отправителю:

[sender setBackgroundImage:[UIImage imageNamed:@"new-image.png"] forState:UIControlStateNormal];

Если вам нужен тег, то метод ACBurk подойдет.

0 голосов
/ 06 октября 2013

Создайте подкласс для кнопки, чтобы сохранить требуемое значение, возможно, создать протокол (ControlWithData или что-то).Установите значение при добавлении кнопки в ячейку табличного представления.В вашем событии касания проверьте, подчиняется ли отправитель протоколу, и извлеките данные.Обычно я храню ссылку на фактический объект, который отображается в ячейке табличного представления.

0 голосов
/ 14 мая 2010
// how do I know which button sent this message?
// processing button press for this row requires an indexPath.

Довольно просто:

- (void)buttonPressedAction:(id)sender
{
    UIButton *button = (UIButton *)sender;
    CGPoint rowButtonCenterInTableView = [[rowButton superview] convertPoint:rowButton.center toView:self.tableView];
    NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:rowButtonCenterInTableView];
    MyTableViewItem *rowItem = [self.itemsArray objectAtIndex:indexPath.row];
    // Now you're good to go.. do what the intention of the button is, but with
    // the context of the "row item" that the button belongs to
    [self performFooWithItem:rowItem];
}

Работает хорошо для меня: P

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

0 голосов
/ 05 октября 2012

Все просто; сделайте кастомную ячейку и возьмите розетку кнопки

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
         NSString *identifier = @"identifier";
        customCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];

    cell.yourButton.tag = indexPath.Row;

- (void)buttonPressedAction:(id)sender

изменить идентификатор в вышеуказанном методе на (UIButton *)

Вы можете получить значение, на которое нажимается кнопка, с помощью sender.tag.

0 голосов
/ 07 декабря 2010

создайте nsmutable массив и поместите все кнопки в этот массив

в методе нажатия кнопки

-

 (void)buttonPressedAction:(id)sender
{
    UIButton *button = (UIButton *)sender;

for(int i=0;i<[yourArray count];i++){

if([buton isEqual:[yourArray objectAtIndex:i]]){

//here write wat u need to do

}
}
0 голосов
/ 09 мая 2011

Небольшое отклонение от ответа Cocoanuts (которое помогло мне решить эту проблему), когда кнопка находилась в нижнем колонтитуле таблицы (что не позволяет найти «нажатую ячейку»):

-(IBAction) buttonAction:(id)sender;
{
    id parent1 = [sender superview];   // UiTableViewCellContentView
    id parent2 = [parent1 superview];  // custom cell containing the content view
    id parent3 = [parent2 superview];  // UITableView containing the cell
    id parent4 = [parent3 superview];  // UIView containing the table

    UIView *myContentView = (UIView *)parent1;
    UITableViewCell *myTableCell = (UITableViewCell *)parent2;
    UITableView *myTable = (UITableView *)parent3;
    UIView *mainView = (UIView *)parent4;

    CGRect footerViewRect = myTableCell.frame;
    CGRect rect3 = [myTable convertRect:footerViewRect toView:mainView];    

    [cc doSomethingOnScreenAtY:rect3.origin.y];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...