action: @selector (showAlert :), как передать параметр в этом методе showAlert? - PullRequest
6 голосов
/ 02 октября 2009

Я добавляю пользовательскую кнопку к своему UITableViewCell. В действии этой кнопки я хочу вызвать функцию showAlert: и передать метку ячейки в методе.

Как передать параметр в этом showAlert методе: action:@selector(showAlert:)?

Ответы [ 3 ]

9 голосов
/ 02 октября 2009

Если вы используете Button в Tableviewcell, вам нужно добавить значение тега для кнопки каждой ячейки и установить метод addTarget с id в качестве параметра.

Пример кода:

Вы должны ввести код ниже в методе cellForRowAtIndexPath.

{

     // Set tag to each button
        cell.btn1.tag = indexPath.row; 
        [cell.btn1 setTitle:@"Select" forState:UIControlStateNormal];  // Set title 

     // Add Target with passing id like this
        [cell.btn1 addTarget:self action:@selector(btnClick:) forControlEvents:UIControlEventTouchUpInside];    


     return cell;

}

-(void)btnClick:(id)sender
{

    UIButton* btn = (UIButton *) sender;

     // here btn is the selected button...
        NSLog(@"Button %d is selected",btn.tag); 


    // Show appropriate alert by tag values
}
2 голосов
/ 02 октября 2009

Это невозможно. Вы должны создать метод, соответствующий IBAction

- (IBAction)buttonXYClicked:(id)sender;

В этом методе вы можете создавать и вызывать UIAlertView. Не забудьте связать кнопку с методом в Интерфейсном Разработчике.

Если вы хотите различать несколько кнопок (например, у вас есть одна в каждой ячейке таблицы), вы можете установить свойство тега кнопки. А затем проверьте sender.tag, с какой кнопки приходит щелчок.

1 голос
/ 01 мая 2013

Ответ Джея великолепен, но если у вас есть несколько разделов, он не будет работать, поскольку indexRow локально для раздела .

Другой способ, если вы используете кнопки в TableView, который имеет несколько разделов, - это передать сенсорные события.

Где вы заявляете свою кнопку в ленивом загрузчике:

- (UIButton *)awesomeButton
{
    if(_awesomeButton == nil)
    {
        _awesomeButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
        [_awesomeButton addTarget:self.drugViewController action:@selector(buttonPressed:event:) forControlEvents:UIControlEventTouchUpInside];
    }

    return _awesomeButton;
}

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

Функция, к которой подключена кнопка:

- (void)buttonPressed:(id)sender event:(id)event
{
    NSSet *touches = [event allTouches];
    UITouch *touch = [touches anyObject];

    CGPoint currentTouchPosition = [touch locationInView:self.tableView];
    NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint: currentTouchPosition];

    NSLog(@"Button %d was pressed in section %d",indexPath.row, indexPath.section);
}

Ключом здесь является функция indexPathForRowAtPoint. Это изящная функция в UITableView, которая в любой момент выдаст вам indexPath. Также важна функция locationInView, потому что вам нужно прикосновение в контексте tableView, чтобы оно могло точно определить конкретный indexPath.

Это позволит вам узнать, какая это кнопка, в таблице с несколькими разделами.

...