UITableView单元格按钮混乱

时间:2013-04-24 16:57:47

标签: iphone ios objective-c uitableview

我遇到问题,将按钮设置为UITableviewCell
viewDidLoad之后,按钮位于正确的位置。但是当我向下滚动时,按钮就在其他任何地方。

这是我的代码,希望你能帮助我。
在此先感谢。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"Cell";

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
}

if (indexPath.section == 0 && indexPath.row == 0 && _isAddImageViewLoad == NO) {
    // Add Image Button
    UIButton *addImage = [UIButton buttonWithType:UIButtonTypeCustom];
    UIImage* image = [UIImage imageNamed:@"AddImage@2x"];
    addImage.frame = CGRectMake(110.0f, 10.0f, 110.0f, 110.0f);
    [addImage setImage:image forState:UIControlStateNormal];

    [cell.contentView addSubview:addImage];
    _isAddImageViewLoad = YES;
} else {
    NSDictionary *dictionary = [_items objectAtIndex:indexPath.section];
    NSArray *array = [dictionary objectForKey:@"data"];
    NSString *cellValue = [array objectAtIndex:indexPath.row];
    cell.textLabel.text = cellValue;
}

return cell;

}

5 个答案:

答案 0 :(得分:1)

这是因为你正在重复使用单元格,并且当按钮在你的其他部分不应该是一个简单的解决方案时就会被放置。写addImage.hidden = YES;并在if语句中添加addImage.hidden = NO;

答案 1 :(得分:0)

看看这行代码:

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

这行代码表示每次都不会创建UITableViewCells。当您向上和向下滚动时,它们会被重复使用。使用上面的代码,UIButton将在正确的位置创建,但随后重新使用单元格,它将在随机位置创建按钮。

解决问题的一种快速方法,将上面的代码行改为

UITableViewCell *cell;

答案 2 :(得分:0)

只是一些事情。如果您使用“AddImage”,它将自动使用“AddImage @ 2x”,如果它是视网膜显示器。我不认为这会解决你的问题,但它可能会导致奇怪。

当表视图单元格从视图滚动时,它在某种意义上被“回收”。看起来您正在使用bool来排除原始单元格再次使用按钮加载。如果您总是希望它位于“顶部”,您可能需要使用标题来保留按钮。您可能还想验证在重复使用单元格时是否删除了该按钮。如果不是它将显示在重用该单元格的下一行。

旁注...按钮在表格视图单元格中通常不能很好地工作,因为它们以非常不同的方式处理触摸。让它们感觉自然是一种相当大的修改,但这是另一回事。

希望有所帮助!

答案 3 :(得分:0)

问题在于细胞重用。您需要在else子句中放入一些代码,以便在退出时删除该按钮。一种方法是给你的按钮一个标签,如:

addImage.tag = 10;

然后在你的else子句中:

}else{
    if (cell viewWithTag:10) [[cell viewWithTag: 10] removeFromSuperview];
    ...

答案 4 :(得分:0)

问题在于细胞的出列。 tableview第一次创建单元格时,所有单元格都通过

运行
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];

代码。但是当第0行第0行移出屏幕时,该单元格被推入单元可重用队列。

现在,当您的tableview需要显示第0行第0行时,它将从重用队列中获取一个单元格。你不会得到第一次相同的细胞。所以现在你可能有两个按钮单元格。

您应该做的是为第0行第0行以及所有其他部分和行设置不同的CellIdentifier。在创建单元格时也创建按钮。因此,在tableView第一次创建单元格之后,您将不会创建所有按钮。