对UITableView中的按钮执行操作

时间:2011-10-04 15:14:31

标签: iphone uitableview uibutton

我在UITableViewCell中有一个UIButton ... 我想对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]];
}

2 个答案:

答案 0 :(得分: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]];

或者你可以通过访问发件人的超级视图获得相同的结果,但我发现这更难以调试。

答案 1 :(得分:0)

我更喜欢使用:

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

它不依赖于表格中的单元格位置