我正在为UITableViewCell
添加自定义按钮。在该按钮的操作中,我想调用showAlert:
函数,并希望在方法中传递单元格标签。
如何通过此showAlert
方法传递参数:action:@selector(showAlert:)
?
答案 0 :(得分:9)
如果您在Tableviewcell中使用Button,则必须为每个单元格的按钮添加标记值,并将方法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
}
答案 1 :(得分:2)
那是不可能的。您必须创建符合IBAction的方法
- (IBAction)buttonXYClicked:(id)sender;
在此方法中,您可以创建并调用UIAlertView。不要忘记将按钮与Interface Builder中的方法连接。
如果您想区分多个按钮(例如,每个表格单元格中有一个),您可以设置按钮的标记属性。然后检查sender.tag,从哪个按钮点击。
答案 2 :(得分:1)
杰伊的答案很棒,但如果你有多个部分,那么因为indexRow是local to a section,它将无法工作。
另一种方法,如果您在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。
这将允许您在具有多个部分的表中知道它是哪个按钮。