Ios 获取UIButton的UITableViewCell?

Ios 获取UIButton的UITableViewCell?,ios,uitableview,uibutton,Ios,Uitableview,Uibutton,我正在尝试使用ui按钮执行一个segue,该按钮位于名为GFHomeCell的自定义UITableViewCell类中 GFHomeCell有一个postID属性,我想在prepare for segue中发送它。我设置了一个在按下按钮时运行的方法;但是,在按下按钮的方法中,我需要发送者是GFHomeCell(或者至少我假设是这样) 有人知道我该怎么做吗?这是我的密码 MycellForRowAtIndexPath: GFHomeCell *cell = [tableView d

我正在尝试使用
ui按钮执行一个segue,该按钮位于名为
GFHomeCell
的自定义
UITableViewCell
类中

GFHomeCell
有一个
postID
属性,我想在prepare for segue中发送它。我设置了一个在按下按钮时运行的方法;但是,在按下按钮的方法中,我需要发送者是
GFHomeCell
(或者至少我假设是这样)

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

My
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;
这是我在单击按钮时正在运行的方法。我的想法是,我需要发送者是一个单元格,而不是一个按钮,因为我在
prepareforsgue
中发送的
postId
属性只存在于
GFHomeCell
上:

- (void)commentButtonClick:(id)sender {
    [self performSegueWithIdentifier:@"addCommentSegue" sender:sender];
}
最后,我的
prepareForSegue
(我只包括与本节相关的部分):


我是iOS新手,这让我很难堪,所以非常感谢您的帮助,谢谢

答案之一是,只需在视图层次结构中上升一个级别:

 - (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];

好的,一个答案是在视图层次结构中向上提升一个级别:

 - (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];

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

-(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。

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

-(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。

一个常见习惯用法是将每个单元格按钮上的标记设置为可以返回单元格的内容——可以是数组索引或单元格行(如果只有一个节)。然后在button click事件处理程序中,您只需访问sender.tag就可以了…一个常见的习惯用法是将每个单元格按钮上的标记设置为可以返回单元格的内容--可以是数组索引或单元格行(如果只有一个节)。然后,在按钮单击事件处理程序中,您只需访问sender.tag,然后就可以了……这是一种非常脆弱的方法,尽管同意……应该记得我自己在iOS7转换中遇到过这种情况!这是一种非常脆弱的方式,尽管我同意……应该记得我自己在iOS7过渡时遇到过这种情况!谢谢你的评论。你能给我举一个例子说明第二种方法是什么样的吗。只是sender框中的sender.tag,还是我将使用sender.tag获取单元格。@jckly,我仍然会使用sender作为PerformsgueWithIdentifier:sender:中的参数,然后在prepareForSegue:sender:方法中,使用sender.tag获取包含按钮的行。然后应该从数组中该索引处的对象获取数据,而不是从单元格获取数据。从单元格中获取数据通常不是一个好主意,单元格用于显示数据。谢谢您的评论。你能给我举一个例子说明第二种方法是什么样的吗。只是sender框中的sender.tag,还是我将使用sender.tag获取单元格。@jckly,我仍然会使用sender作为PerformsgueWithIdentifier:sender:中的参数,然后在prepareForSegue:sender:方法中,使用sender.tag获取包含按钮的行。然后应该从数组中该索引处的对象获取数据,而不是从单元格获取数据。从单元格中获取数据通常不是一个好主意,单元格用于显示数据。