按下按钮,在cellForRowAtIndexPath中发送单元格值

时间:2010-09-26 21:59:31

标签: iphone objective-c uitableview uibutton

我在向表格视图单元格添加按钮时偶然发现了一个问题。

在我添加代码后,让我解释一下:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"Cell";

RadioCustomCell * cell = (RadioCustomCell*)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[RadioCustomCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];

        [cell setChannelImage:[UIImage imageNamed:@"p4.png"]];

        UILabel *nowTitle = [UILabel alloc];
        nowTitle.text = @"In My Heart";
        [cell setNowTitle:nowTitle];

        UILabel *nowArtist = [UILabel alloc];
        nowArtist.text = @"Moby";
        [cell setNowArtist:nowArtist];

        UILabel *nextTitle = [UILabel alloc];
        nextTitle.text = @"Only Girl (In The World)";
        [cell setNextTitle:nextTitle];

        UILabel *nextArtist = [UILabel alloc];
        nextArtist.text = @"Rihanna";
        [cell setNextArtist:nextArtist];

        // My button right here
        UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
        button.frame = CGRectMake(6 ,31, 110, 20);
        [button setImage:[UIImage imageNamed:@"radionorge.png"] forState:UIControlStateNormal];
        [button addTarget:self action:@selector(touched:) forControlEvents:UIControlEventTouchUpInside];

        [cell.backView addSubview:button];

    }
    return cell;
}

按钮动作的“触摸”功能。

-(void)touched:(id)Sender {

    // Here i want to get the UILabels for each cell. Such as nowArtist.

}

你看,我想在触摸功能的每个单元格中获取UILabel文本。 我知道你必须以某种方式使用Sender作为指针,但我不知道如何。

4 个答案:

答案 0 :(得分:0)

UIButton有一个名为“tag”的属性,它的目的正是用于识别按钮,尝试设置一个值,通过在tag属性中设置索引来帮助您找到所需的值。

答案 1 :(得分:0)

首先,您需要为每个标签设置标签属性。使用#define或const是一个好主意,但为了简单起见,我假设您将按照它们在代码中出现的顺序为每个UILabel使用1,2,3和4。

这就是你的动作代码应该是什么样子。 (您可能需要稍微调整一下。)

-(void)touched:(id)Sender {
    // Here i want to get the UILabels for each cell. Such as nowArtist.
    if ([sender isKindOfClass:[UIButton class]]) {
        UIButton *button = (UIButton *)sender;
        UIView *contentView = button.superview;
        UIView *viewWithTag1 = [contentView viewWithTag:1];
        if ([viewWithTag1 isKindOfClass:[UILabel class]]) {
             UILabel *titleLabel = (UILabel *)viewWithTag1;
             // You now have the title label.
        }
        // Repeat the above for each tag.
}

一个观察结果:你在代码中泄漏了很多对象。每次更新单元格时都不需要分配一堆新标签。只需使用:

cell.nowTitle.text = @"In My Heart";

答案 2 :(得分:0)

我想让你想在表格行的触摸事件中执行特定的代码。 看看这对你有意义。

  1. 将UiButton作为附件视图添加到cellForRowAtIndexPath中的单元格           UIButton * button = [[[UIButton alloc] initWithFrame:CGRectZero] autorelease];            //您可以在此处指定按钮的图像。           [cell addSubview:button];           cell.accessoryView = button;
  2. 我希望你不是所有的艺术家和标题的硬编码..让我们说你正在使用数组。 关于任何单元格的触摸事件。在UITableView方法didSelectRowAtIndexPath中 你将得到行号...用它来从数组中获取Label文本。

答案 3 :(得分:0)

我们大多数人都不熟悉另一种方法,我认为它非常有用。检查下面。

- (void)touched:(id)sender {
    UIButton *btn = (UIButton *)sender;
    NSIndexPath *indexpath = [self.tableview indexPathForRowAtPoint:btn.center];
    RadioCustomCell *currentCell = (RadioCustomCell *)[tableview cellForRowAtIndexPath:indexpath]
    UILabel *titleLabel = (UILabel *)[currentCell viewWithTag:YourTag];
}