Iphone UITableView单元格按钮混淆

Iphone UITableView单元格按钮混淆,iphone,ios,objective-c,uitableview,Iphone,Ios,Objective C,Uitableview,我有一个问题,将按钮设置为UITableviewCell 在viewDidLoad之后,按钮位于正确的位置。但当我向下滚动时,按钮位于其他任何位置。 这是我的代码,希望你能帮助我 提前谢谢 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *CellIdentifier = @"Cell"; UITabl

我有一个问题,将按钮设置为
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;

}看看这行代码:

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
这行代码意味着并非每次都创建
UITableViewCells
。它们在你上下滚动时被重复使用。使用上面的代码,将在正确的位置创建
ui按钮
,但在重复使用单元格时,它将在随机点创建按钮

一个快速解决问题的方法是,将上面的代码行更改为simply

UITableViewCell *cell;

请看这行代码:

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
这行代码意味着并非每次都创建
UITableViewCells
。它们在你上下滚动时被重复使用。使用上面的代码,将在正确的位置创建
ui按钮
,但在重复使用单元格时,它将在随机点创建按钮

一个快速解决问题的方法是,将上面的代码行更改为simply

UITableViewCell *cell;

这是因为您正在重复使用单元格,而按钮在您的else部分不应该是一个简单的解决方案时被放置。写入
addImage.hidden=YES并在if语句中放入
addImage.hidden=NO

这是因为您正在重复使用单元格,而按钮被放置在您的else部分不应该是一个简单的解决方案的时候。写入
addImage.hidden=YES并在if语句中放入
addImage.hidden=NO

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

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

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


希望有帮助

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

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

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


希望有帮助

问题在于单元重用。如果按钮退出,您需要在else子句中添加一些代码来删除它。一种方法是为按钮添加一个标签,如:

addImage.tag = 10;
然后在你的else条款中:

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

问题在于单元重用。如果按钮退出,您需要在else子句中添加一些代码来删除它。一种方法是为按钮添加一个标签,如:

addImage.tag = 10;
然后在你的else条款中:

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

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

    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
代码。但当第0节第0行移出屏幕时,该单元格将被推入单元格可重用队列

现在,当tableview需要显示第0节第0行时,它将从重用队列中获取一个单元格。您将无法获得与第一次相同的单元格。现在你可能有两个带按钮的单元格


您应该为节0第0行以及所有其他节和行使用不同的CellIdentifier。创建单元格时也要创建按钮。因此,在tableView首次创建单元格后,您将不会创建按钮“一切”。

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

    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
代码。但当第0节第0行移出屏幕时,该单元格将被推入单元格可重用队列

现在,当tableview需要显示第0节第0行时,它将从重用队列中获取一个单元格。您将无法获得与第一次相同的单元格。现在你可能有两个带按钮的单元格


您应该为节0第0行以及所有其他节和行使用不同的CellIdentifier。创建单元格时也要创建按钮。因此,在tableView第一次创建单元格后,您将不会创建按钮所有内容。

那么他不会重用单元格,滚动性能将受到影响,而不是不重用单元格。最好使用两个单独的标识符,一个带按钮,另一个不带按钮。这也是一个选项,但不重用单元格,绝对不是一个选项如果他不重用单元格,滚动性能将受到影响,而不是不重用单元格最好使用两个单独的标识符,一个带按钮,另一个带not。这也是一个选项,但不重用单元格,当然不是一个选项。你能提供更多的信息,让问题更清楚一点吗?你能提供更多的信息,让问题更清楚一点吗