action:@selector(showAlert:) как передать параметр в этот метод showAlert?
-
19-09-2019 - |
Вопрос
Я добавляю пользовательскую кнопку в свой UITableViewCell
.В действии этой кнопки я хочу позвонить showAlert:
функцию и хотите передать метку ячейки в метод.
Как я могу передать параметр в этом showAlert
метод: action:@selector(showAlert:)
?
Решение
Это невозможно.Вам необходимо создать метод, соответствующий IBAction.
- (IBAction)buttonXYClicked:(id)sender;
В этом методе вы можете создать и вызвать UIAlertView.Не забудьте связать кнопку с методом в Interface Builder.
Если вы хотите различать несколько кнопок (например,у вас есть по одному в каждой ячейке таблицы), вы можете установить свойство тега кнопки.А потом проверьте sender.tag, от какой кнопки происходит нажатие.
Другие советы
Если вы используете кнопку в Tableviewcell, вам нужно добавить значение тега к кнопке каждой ячейки и установить метод addTarget с идентификатором в качестве параметра.
Образец кода:
Вам необходимо ввести код ниже 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
}
Ответ Джея великолепен, но если у вас несколько разделов, он не будет работать, поскольку 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.
Это позволит вам узнать, какая это была кнопка, в таблице с несколькими разделами.