获取 UIButton 的 UITableViewCell?

Posted

技术标签:

【中文标题】获取 UIButton 的 UITableViewCell?【英文标题】:Get UITableViewCell of UIButton? 【发布时间】:2014-04-08 22:19:06 【问题描述】:

我正在尝试使用UIButton 执行转场,该UIButton 位于名为GFHomeCell 的自定义UITableViewCell 类中。

GFHomeCell 有一个 postID 属性,我想将其发送到为 segue 做准备。我设置了一个在按下按钮时运行的方法;但是,在按下按钮的方法中,我需要发件人是GFHomeCell(或者至少我假设是这样)。

有人知道我该怎么做吗?这是我的代码

我的cellForRowAtIndexPath

        GFHomeCell *cell = [tableView dequeueReusableCellWithIdentifier:@"newsfeedCell" forIndexPath:indexPath];

        NSDictionary *rootObject = self.posts[indexPath.row];
        NSDictionary *post = rootObject[@"post"];
        NSDictionary *group = post[@"group"];

        NSString *groupName = group[@"name"];

        cell.actionLabel.text = [NSString stringWithFormat:@"New post trending on %@", groupName];
        cell.descriptionLabel.text = post[@"body"];
        cell.descriptionLabel.numberOfLines = 0;
        cell.descriptionLabel.lineBreakMode = NSLineBreakByWordWrapping;
        cell.likesLabel.text = [NSString stringWithFormat:@"%@", post[@"likes"]];
        cell.postId = post[@"id"];
        cell.groupName = group[@"name"];
        cell.postBody = post[@"body"];
        cell.likeButton.tag = indexPath.row;
        [cell.likeButton addTarget:self action:@selector(likeButtonClick:) forControlEvents:(UIControlEvents)UIControlEventTouchDown];
        [cell.commentButton addTarget:self action:@selector(commentButtonClick:) forControlEvents:(UIControlEvents)UIControlEventTouchDown];

        NSString *urlString = [NSString stringWithFormat:@"%s/%@", kBaseURL, @"images/"];
        NSURL *url = [NSURL URLWithString:urlString];
        [cell.imageView setImageWithURL:url
                       placeholderImage:[UIImage imageNamed:@"Newsfeed-Image-Placeholder"]];

        return cell;

这是单击按钮时我正在运行的方法。我的想法是,我需要这里的发件人是一个单元格,而不是一个按钮,因为我在 prepareForSegue 中发送的 postId 属性只存在于 GFHomeCell 上:

- (void)commentButtonClick:(id)sender 
    [self performSegueWithIdentifier:@"addCommentSegue" sender:sender];

最后是我的prepareForSegue(我只包含了与这个segue相关的部分):

 else if ([segue.identifier isEqualToString:@"addCommentSegue"]) 
   GFPostShowViewController *destViewController = segue.destinationViewController;
    GFHomeCell * cell = sender;

    destViewController.postId = [cell.postId copy];
    destViewController.groupName = [cell.groupName copy];
    destViewController.postBody = [cell.postBody copy];

 else 

我是 ios 新手,这让我很困惑,所以非常感谢任何帮助,谢谢。

【问题讨论】:

一个常见的习惯用法是将每个单元格按钮上的标签设置为可以让您返回单元格的内容——可以是数组索引或单元格行(如果只有一个部分)。然后在按钮单击事件处理程序中,您只需访问 sender.tag 就可以了... 【参考方案1】:

对于这种情况,基本上有两种常见的方法。一种是向上搜索按钮的超级视图,直到找到单元格。您不应该依赖于上一层或两层,因为层次结构在过去已经改变,并且可能会再次改变(在 iOS 6 中您需要上两层,但在 iOS 7 中需要上三层)。你可以这样做,

-(void)commentButtonClick:(UIButton *) sender 
    id superView = sender.superview;
    while (superView && ![superView isKindOfClass:[UITableViewCell class]]) 
        superView = [superView superview];
    
    [self performSegueWithIdentifier:@"addCommentSegue" sender:superView];

另一种方法是在 cellForRowAtIndexPath: 中为您的按钮分配一个标签:等于 indexPath.row(如果您只有一个部分),然后使用 sender.tag 获取包含点击按钮的单元格的 indexPath .

【讨论】:

感谢您的 cmets。你能给我一个例子,说明第二种方法的方法是什么样的。只是发件箱中的 sender.tag 还是我要使用 sender.tag 来获取单元格。 @jckly,我仍然会使用 sender 作为 performSegueWithIdentifier:sender: 中的参数,然后在 prepareForSegue:sender: 方法中,使用 sender.tag 获取包含按钮的行。然后,您应该从数组中该索引处的对象获取数据,而不是从单元格中获取数据。从单元格中获取数据通常不是一个好主意,单元格用于显示数据。【参考方案2】:

嗯,一个答案是在视图层次结构中上一层:

 - (void)commentButtonClick:(id)sender 
    GFHomeCell * cell = (GFHomeCell *) [(UIButton*)sender superview];
    if (cell && [cell Class] == [GFHomeCell class]) 
        //do whatever with cell.postID
        [self performSegueWithIdentifier:@"addCommentSegue" sender:sender];
     

哦,我忘记了……您可能需要上两层才能通过 contentView 属性:

   GFHomeCell * cell = (GFHomeCell *) [[(UIButton*)sender superview] superview];

【讨论】:

这是一种非常脆弱的方法 同意...应该记得我自己在 iOS7 过渡时遇到了这个问题!

以上是关于获取 UIButton 的 UITableViewCell?的主要内容,如果未能解决你的问题,请参考以下文章

如何获取 UITableView 的所有单元格?

如何从数组中过滤多个选定值并将其从 uibutton 加载到其他 uitableview

如何管理 UITableView + 动态自定义单元格(UIBUtton + UITextField + UIBUtton)插入?

将 UIButton 放入 UITableView

UIButton 干扰 UITableView

动态更改 UITableView 单元格中 UIButton 的图像