Ios cellForRowAtIndexPath方法自定义按钮显示2次

Ios cellForRowAtIndexPath方法自定义按钮显示2次,ios,iphone,ipad,ios8,Ios,Iphone,Ipad,Ios8,我在cellforrowatinexpath方法中使用了此代码。当我点击按钮或滚动表格时,该按钮显示两次。为什么这个按钮显示了两次请帮帮我 UIButton *trashbtn=[[UIButton alloc]initWithFrame:CGRectMake(cell.frame.size.width-20, cell.frame.size.height-30, 20, 20)]; [trashbtn setImage:[UIImage imageNamed:@"editor_trash"]

我在
cellforrowatinexpath
方法中使用了此代码。当我点击按钮或滚动表格时,该按钮显示两次。为什么这个按钮显示了两次请帮帮我

UIButton *trashbtn=[[UIButton alloc]initWithFrame:CGRectMake(cell.frame.size.width-20, cell.frame.size.height-30, 20, 20)];
[trashbtn setImage:[UIImage imageNamed:@"editor_trash"] forState:UIControlStateNormal];
[trashbtn addTarget:self action:@selector(DeleteMyAssociate:) forControlEvents:UIControlEventTouchUpInside];
[trashbtn setTag:indexPath.row];
[cell addSubview:trashbtn];

您应该首先在IB中的表中添加UITableViewCell。然后为该单元格提供一个标识符,例如“MyCelliIdentifier”。仍然在IB上,将您的插座添加到该单元格中,例如按钮、文本字段。。。最初可以将按钮设置为不可见。然后在方法CellForRowatineXpath中,执行以下操作:

- (UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath
{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MyCellIdentifier"];
    if(cell){
        myButton.hidden = NO; // 
        myTextField.text = @"BlaBlaBla";
    }
}

嘿,我可以给你一个建议,使用自动布局和故事板来添加按钮,而不是以编程方式添加它
这是一种更好、更干净的方法。

您面临的问题是,单元格在TableView中被重用,因此第一次创建按钮并将其添加到单元格时,它会出现一次。但如果它已退出队列,则它已具有该按钮,因此,当您添加另一个按钮时,最终会出现多个按钮

有两种方法可以纠正这个问题

首先,删除单元格的
prepareforeuse
方法中的按钮,该方法在重新使用单元格后立即调用


其次,避免在
cellForTableView…
方法中创建自定义视图。使用已有按钮的自定义单元格。现在,你可能会问,如果我这样做,我如何连接按钮的操作?您可以为单元格提供一个调用视图控制器的委托方法,也可以在单击按钮时向单元格传递一个要执行的块。

据我所知,您已经有了一个自定义单元格。。在现有单元格中添加一个按钮,并在customCell.h文件中为其创建一个IbOutlet 然后在cellForRowAtIndexPath方法中,使用按钮的IBOutlet访问按钮

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
   {

    customCell *cell =(customCell*) [tableView dequeueReusableCellWithIdentifier:@"customCell" forIndexPath:indexPath];

    [cell.btn setTitle:@"blabla" forState:UIControlStateNormal];
    [cell.btn setTag:indexPath.row];
    [cell.btn addTarget:self action:@selector(method:) forControlEvents:UIControlEventTouchUpInside];
    if(condition)
     {
     cell.btn.hidden=YES;
     }
     else
     {
     cell.btn.hidden = NO;
     }
   return cell;
}
不要忘记在ViewController类中注册customCell类 [tableName registerNib:[UINib nibWithNibName:@“customCell”捆绑包:无]强制重用标识符:@“customCell”]

您可以根据需要隐藏或取消隐藏按钮,以及在每个类中向按钮添加不同的操作。 快乐的编码


如果我的代码对您有帮助,请务必投票表决……)

这是一种非常古老的获取细胞的方法。如果您使用`-dequeueReusableCellWithIdentifier:forIndexPath:`方法,并且您已经正确注册了单元标识符,或者在故事板中创建了单元,那么它将始终返回一个单元,因此无需检查返回的单元是否为零。我检查该单元的事实不是零,这并不意味着这是一种古老的方法。如果您在IB文件上造成灾难,您将捕获它。我的应用程序非常健壮,因为我是这样做的;CustomCell*cell=(CustomCell)[tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];如果(cell==nil){NSArray*nib=[[NSBundle mainBundle]loadNibNamed:@“CustomCell”所有者:self选项:nil];cell=[nib objectAtIndex:0];}@Leonardo如何使用“始终”返回单元格的方法不可靠?如果您的nib文件没有正确的单元格标识符,您仍然会遇到崩溃。另外-我运行单元测试来检查这一点,这使我的代码更加健壮。@Abizern-如dequeueReusableCellWithIdentifier文档中所述:“如果没有可重用的单元,并且您没有注册类或nib文件,则此方法返回nil。”如果是建议,作为注释可能比作为答案更好。静态NSString simpleTableIdentifier=@“CustomCell”;CustomCell*cell=(CustomCell)[tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];if(cell==nil){NSArray*nib=[[NSBundle mainBundle]loadNibNamed:@“CustomCell”所有者:自选项:nil];cell=[nib objectAtIndex:0];}在此之后,我想在单元格上添加一个按钮。因为您已经为单元格创建了一个xib文件,所以最好只在该xib文件中添加按钮。@AkshayAgrawal,先生,我可以这样做,但我在单元格上使用了许多不同的2表,每个表都需要单元格上的Different-2操作按钮。