iOS - 捕获按钮单击添加到UITableViewCell的子视图

时间:2013-04-28 22:41:38

标签: ios objective-c uiview uitableview

我正在尝试使用CollapseClick表格控件。这一切都有效,但我似乎无法向表格单元格展开时显示的视图添加按钮事件。

查看代码时,它是UITableView,它创建UITableViewCell并动态添加UIView。我认为这里添加了UIView

+ (CollapseClickCell *)newCollapseClickCellWithTitle:(NSString *)title index:(int)index    content:(UIView *)content {
    NSArray* views = [[NSBundle mainBundle] loadNibNamed:@"CollapseClickCell" owner:nil options:nil];
    CollapseClickCell *cell = [[CollapseClickCell alloc] initWithFrame:CGRectMake(0, 0, 320, kCCHeaderHeight)];
    cell = [views objectAtIndex:0];

    // Initialization Here
    cell.TitleLabel.text = title;
    cell.index = index;
    cell.TitleButton.tag = index;
    cell.ContentView.frame = CGRectMake(cell.ContentView.frame.origin.x, cell.ContentView.frame.origin.y, cell.ContentView.frame.size.width,  content.frame.size.height);
    [cell.ContentView addSubview:content];

    return cell;
}

按钮显示,但如果我尝试连接任何事件,我无法捕捉它们。

这可能很简单。我把应用放在这里:http://www.havoc-media.com/TravelApp.zip

2 个答案:

答案 0 :(得分:1)

在查看代码时,在使用视图时,您会有一些忽视。

了解视图最重要的一点是,为了让点击事件在子视图上注册,父视图不能更小。这里的愚蠢之处在于,即使您可以直观地看到注入ContentView的视图,内容视图的宽度也会设置为零,这意味着ContentView中的所有视图都可能显示,但不会响应点击事件和点击事件将默认为ContentView的父视图,从而使您的按钮无法使用且无响应。

要在openCollapseClickCellAtIndex中解决此问题,您需要添加代码:

cell.ContentView.frame = CGRectMake(cell.ContentView.frame.origin.x, cell.ContentView.frame.origin.y, 320, cell.ContentView.frame.size.height); 

您的第二个问题是您创建的CollapseClickCell xib未与视图控制器进行通信。这意味着您在视图控制器中创建并注入CollapseClickCell xib的视图,您要将其报告给视图控制器....不是。

有一种方法可以解决这个问题,但在我看来,我会创建另一个自定义xib-A注入你的CollapseClickCell,并让xib-A处理你的按钮点击事件而不是test1View。创建一个名为“testView”的xib链接到测试类,并将此代码放在

-(UIView *)viewForCollapseClickContentViewAtIndex:(int)index
 {
  NSArray* views = [[NSBundle mainBundle] loadNibNamed:@"testView" owner:nil options:nil];

  UIView *content = [views objectAtIndex:0];

  switch (index) {
    case 0:
      return content; /*test1View;*/
      break;

解决了这两个问题后,您的代码就可以运行了。如果你想看到它,我可以在代码中加入我想要的内容吗?

答案 1 :(得分:0)

首先,此代码不正确:

NSArray* views = [[NSBundle mainBundle] loadNibNamed:@"CollapseClickCell" owner:nil options:nil];
CollapseClickCell *cell = [[CollapseClickCell alloc] initWithFrame:CGRectMake(0, 0, 320, kCCHeaderHeight)];
cell = [views objectAtIndex:0];

您首先通过[collapseClickCell alloc]创建一个单元格。但之后,您将使用loadNibNamed:owner:options:nil创建的数组的第一个对象分配给同一个变量。您可以从笔尖加载单元格,也可以以编程方式创建单元格。简单地说,你应该使用:

NSArray* views = [[NSBundle mainBundle] loadNibNamed:@"CollapseClickCell" owner:nil options:nil];
CollapseClickCell *cell = [views objectAtIndex:0];

请注意,您提供给initWithFrame:方法的矩形并未全部使用

向单元格添加按钮不是最合适的事情(整个单元格应该是按钮)。但是,如果您绝对需要,请尝试将uibutton指定为单元格的附件视图。看看http://developer.apple.com/library/ios/#documentation/uikit/reference/UITableViewCell_Class/Reference/Reference.html#//apple_ref/occ/instp/UITableViewCell/accessoryView

类似于:

UITableViewCell *cell = (obtain your cell)
UIButton *button= [UIButton buttonWithType:UIButtonTypeRoundedRect];
[button addTarget:self action:@selector(buttonTapped) forControlEvents:UIControlEventTouchUpInside];
button.frame = CGRectMake(x,y,width,height);
cell.accessoryView = button;