UITableViewCell变得没有响应

时间:2012-03-14 14:20:51

标签: ios ipad uitableview uipopovercontroller

我有一个弹出屏幕,里面有:

  • 标签,可能出现也可能不出现(标题)
  • 搜索栏,可能出现也可能不出现
  • 标签,可能出现也可能不出现,并且具有可变高度(帮助标签)
  • 一个滚动视图,可能出现也可能不出现,并且具有可变高度(有关下表的一些信息)
  • 表格视图

为了呈现一些不错的东西,在viewDidLoad中,我移动各种框架以正确放置对象,而没有未使用的空间使我的弹出窗口混乱。此外,我然后通过contentSizeInPopover调整表格(以占据最需要的位置)和弹出窗口(以避免有一个近乎空的巨大弹出窗口)。所有调整大小似乎都很好,但我有一个大问题:所有调整大小完成后,我的UITableView的一些单元格变得无法响应。一个或两个单元格,通常是第二个单元格,仅在我敲击其外角时才会响应,但是单元格的其余部分完全忽略任何触摸。

我已经尝试了所有方法:将所有内容移至viewWillAppear,让自动调整功能完成其工作(似乎也不起作用),但每次都会遇到此问题。我发现,如果我评论更改表framecontentSizeInPopover中的行所涉及的行,问题就会停止,但是我的视图搞砸了,所以这不是修复。

如果有人能给我一些东西摆脱这个混乱,那就太棒了。

- (CGFloat)getHeightWithoutTable {
    return LIST_TITLE_HEIGHT + (self.searchBar.hidden ? 0 : LIST_SEARCH_BAR_HEIGHT) + (self.helpLabel.hidden ? 0 : self.helpLabel.frame.size.height + LIST_STD_SPACE) + (self.errorScrollView.hidden ? 0 : self.errorScrollView.frame.size.height + LIST_STD_SPACE);
}

-(void)viewDidLoad {
    [super viewDidLoad];
    self.tableViewOutlet.backgroundView = nil;
    self.originData = [NSMutableArray array];
    self.searchedData = [NSMutableArray array];
    if (self.helper != nil) {
        CGFloat heightOffset = 0;
        // Content
        self.originData = [self.helper getData];
        self.tableData = [NSMutableArray arrayWithArray:self.originData];
        // Title
        NSString *title = [self.helper getPopoverTitle];
        if (title == nil) {
            self.popoverTitle.hidden = YES;
            heightOffset -= LIST_TITLE_HEIGHT;
        } else {
            self.popoverTitle.text = [self.helper getPopoverTitle];
        }
        // Search
        if ([self.originData count]  [self getStdHeight] / 3){
                self.helpLabel.lineBreakMode = UILineBreakModeTailTruncation;
                [self.helpLabel sizeThatFits:CGSizeMake(self.helpLabel.frame.size.width, [self getStdHeight] / 3)];
            }

            heightOffset += (self.helpLabel.frame.size.height - LIST_HELP_STD_HEIGHT);
        }
        // Errors
        if ([self.helper respondsToSelector:@selector(getErrors)]) {
            self.errors = [self.helper getErrors];
        }
        if (self.errors == nil || [self.errors count] == 0) {
            self.errorScrollView.hidden = YES;
            self.errorBg.hidden = YES;
            heightOffset -= LIST_ERROR_STD_HEIGHT + LIST_STD_SPACE;
        } else {
            [self createErrorView];
            heightOffset += (self.errorScrollView.frame.size.height - LIST_ERROR_STD_HEIGHT);
        }
        // Table
        CGFloat previewHeight = LIST_CELL_HEIGHT * [self.tableData count] + LIST_STD_SPACE;
        CGFloat remainingHeight = LIST_MAX_HEIGHT - [self getHeightWithoutTable] - LIST_STD_SPACE;
        CGFloat tableHeight = MIN(previewHeight, remainingHeight);
        CGRect tableFrame = self.tableViewOutlet.frame;
        self.tableViewOutlet.frame = CGRectMake(tableFrame.origin.x, tableFrame.origin.y + heightOffset, LIST_WIDTH, tableHeight);
        // Selected items
        if ([helper getSelectedObject] != nil){
            int index = [self.tableData indexOfObject:[helper getSelectedObject]];
            NSIndexPath *indexPath = [NSIndexPath indexPathForRow:index inSection:0];
            [self.tableViewOutlet scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionTop animated:YES];
        }
    }
}

- (CGSize)contentSizeForViewInPopover {
    if (self.navigationController) {
        return CGSizeMake(LIST_WIDTH, LIST_MAX_HEIGHT);
    } else {
        CGFloat totalHeight = [self getHeightWithoutTable] + self.tableViewOutlet.frame.size.height + LIST_STD_SPACE;
        return CGSizeMake(LIST_WIDTH, totalHeight);
    }
}

gist如果你需要一些着色来帮助你)

笔尖的图像:

nib

2 个答案:

答案 0 :(得分:0)

只是在黑暗中拍摄,因为你没有提供任何代码。如果要向UITableCellView添加内容,请记住许多组件将UserInteractionEnabled设置为NO,这将禁用与之交互的能力。确保您添加到单元格中的任何可能占据您正在攻击的空间的项目(可能是单元格的中心?)将UserInteractionEnabled设置为YES

边缘可能仍然有效的原因是UITableCellView由3个主要部分组成,因此您可能只更改中心部分。

发布一些代码然后我们可以更好看。

答案 1 :(得分:0)

我自己找到答案:我在UITableView旁边使用自填UIScrollView的事实似乎是个问题。一旦我用适当的UITableView替换了UIScrollView,问题就消失了。