在UITableView自定义单元格中的元素上点按手势

时间:2012-08-21 08:43:54

标签: ios uitableview uibutton

这个主题已被反复讨论,但经过两天的研究和尝试所有建议的解决方案后,我仍然无法做我想做的事。

首先,我正在使用storyboard为iOS 5创建一个应用程序。

我有一个UITableViewController,有两种类型的单元格(原始“消息”,以及一些“答案”)。我在故事板中创建了我的表,检查了“原型单元格”,设计了2个带有2或3个标签的单元格,textView和图像。然后,我将UITableViewCell子类化为2个新类,我称之为ThreadAlertCellThreadAnswerCell。我为单元格的元素创建了属性,因此我可以以编程方式设置标签和图像的文本。我像往常一样将我的图形元素链接到故事板中的定义。在我的TableViewController中,在cellForRowAtIndexPath中,我创建了单元格并填充它们。到目前为止一切都很好,一切都正确显示,我想要它。

但是,我希望对单元格的图像进行“触摸”,弹出一个新视图,显示用户的个人资料页面(另一个基本视图,我可以使用performSegue执行此操作,没有问题)。

我已经尝试了很多东西,我不确定在这里详细介绍一切是非常有用的。在寻找答案时,我明白当你期望处理手势时使用UIImageView并不是最好的方法。所以我把它改成UIButton。但我不能让触摸事件做任何事情!

我只给出一个“回答”单元格的例子。

这是我的 ThreadAnswerCell 头文件(我不会给.m,没有什么有趣的):

@interface ThreadAnswerCell : UITableViewCell

@property (nonatomic) IBOutlet UILabel *senderLabel;
@property (nonatomic) IBOutlet UILabel *dateLabel;
@property (nonatomic) IBOutlet UITextView *contentTextView;
@property (nonatomic, weak) IBOutlet UIButton *senderButton;

@end

这是我的 TableViewController cellForRowAtIndexPath的一半(我之前的“消息”也是如此):

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *cellIdentifier = @"ThreadAnswerCell";
    ThreadAnswerCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];

    if (cell == nil) {
        cell = [[ThreadAnswerCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
    }

    Message *message = [threadArray objectAtIndex:indexPath.row];

    cell.senderLabel.text = [NSString stringWithFormat:@"%@", message.sender];
    cell.contentTextView.text = [NSString stringWithFormat:@"%@", message.content];
    cell.dateLabel.text = [NSString stringWithFormat:@"%@", message.date];
    //[cell.senderButton setBackgroundImage: [[UIImage alloc] initWithData: [NSData dataWithBase64EncodedString: message.userPic]]
    //                             forState: UIControlStateNormal];

    [cell.senderButton addTarget:self action:@selector(firstButtonSelected:) forControlEvents:UIControlEventTouchUpInside];

    CGRect frame = cell.contentTextView.frame;
    frame.size.height = cell.contentTextView.contentSize.height;
    cell.contentTextView.frame = frame;
    [cell.contentTextView sizeToFit];

    return cell;
}

正如你所看到的,我使用我的自定义单元格,然后用内容填充它(我使用三个无用的stringWithFormat但我有我的理由,哈哈),我尝试向我的按钮添加一个事件。我还评论了设置按钮背景图像的部分,以“看到”屏幕上的按钮。

这是我希望按钮调用的方法:

- (void)firstButtonSelected: (id)sender
{
    NSLog(@"hello");
}

但是,永远不会调用该方法!关于我出错的地方或任何其他工作解决方案的任何想法都会很棒!感谢。

2 个答案:

答案 0 :(得分:3)

你有吗? - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

在tableview委托类中实现了吗?

我认为,你的细胞会抓住触摸事件。尝试删除该方法。和 cell.selectionStyle = UITableViewCellSelectionStyleNone

答案 1 :(得分:0)

这是最顶级的观点吗?确保将senderButton视图最后添加到单元格视图中。 任何其他观点都可能被触及。