0

我创建了一个 customCell UIButtonUILabel

代码在这里:

ItemViewController.h:

@interface ItemViewController : UIViewController<UITableViewDelegate,UITableViewDataSource>
{
    NSArray *arr;
    IBOutlet ItemCustomCell *itemCell;
}

@property(nonatomic,retain)IBOutlet UITableView *tblItem;

ItemViewController.m

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

        ItemCustomCell *cell = (ItemCustomCell *) [tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];

        if (cell == nil) {
            [[NSBundle mainBundle] loadNibNamed:@"ItemCustomCell" owner:self options:nil];
            cell = itemCell;
        }

        cell.btnPlus.tag=indexPath.row;
        [cell.btnPlus addTarget:self action:@selector(incrementValue:) forControlEvents:UIControlEventTouchUpInside];

        return cell;
    }

    -(void)incrementValue:(UIButton *)btnAdd
    {
        NSLog(@"btn%d",btnAdd.tag);
        NSIndexPath *indexPath=[NSIndexPath indexPathForRow:btnAdd.tag inSection:0];
        ItemCustomCell *cell = (ItemCustomCell*)[tblItem cellForRowAtIndexPath:indexPath];
        cell.lblCount.text=[NSString stringWithFormat:@"%d",[cell.lblCount.text intValue]+1];

    }

ItemCustomCell.h

@interface ItemCustomCell : UITableViewCell
{


}

@property(nonatomic,strong)IBOutlet UIButton *btnPlus;
@property(nonatomic,assign)IBOutlet UILabel *lblCount;

标签的默认值为 1。当我单击按钮时,它会显示下一个值。

当我向上或向下滚动时,tableView 标签值重置为 1。我在这里做错了什么?

4

7 回答 7

3

对于 customCell,您需要在 Xib 中指定其重用标识符和类名,并加载到您的单元格以供重用:

    cell = [[[NSBundle mainBundle] loadNibNamed:@"ItemCustomCell" owner:self options:nil] lastObject];

编辑

最好使用 IBOutlet 和委托在 CustomCell 中实现操作,然后使用标签。

//ItemCustomCell.h
@class ItemCustomCell;
@protolcol ItemCustomCellDelegate
  -(void) clickPlusButtonInsideCell:(ItemCustomCell *)cell;
@end
@interface ItemCustomCell
@property(weak, nonatomic) id<ItemCustomCellDelegate> delegate;
//Hookup with your view in Xib
@property (weak, nonatomic) IBOutlet UILabel *label;
-(IBACtion)clickPlusBut:(id)sender;
@end
//ItemCustomCell.m
-(IBACtion)clickPlusBut:(id)sender{
 [self.delegate clickPlusButtonInsideCell:self];
}

利用

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

    ItemCustomCell *cell = (ItemCustomCell *) [tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];

    if (cell == nil) {
cell = [[[NSBundle mainBundle] loadNibNamed:@"ItemCustomCell" owner:self options:nil] lastObject];
    }
    cell.delegate = self;

    return cell;
}

-(void) clickPlusButtonInsideCell:(ItemCustomCell *)cell{
   cell.label.text = @"something";
}
于 2013-08-14T09:39:42.197 回答
2

问题是您正在从与您的按钮关联的函数中设置标签的值。

当您滚动视图,使您的单元格消失并重新出现时,您的控制器会重建您的单元格。

因此,如果您不保存标签的值,那么每次您的单元格离开屏幕时,您都会丢失它。

添加一些东西(如数组)以保存每个标签的值。在增加显示值的同时增加保存的值。

于 2013-08-14T09:46:49.253 回答
0

从 nib 使用 UITableViewCell 时,您应该遵循以下方法。

if (cell == nil) {
     NSArray *topLevelArray =  [[NSBundle mainBundle] loadNibNamed:@"ItemCustomCell" owner:self options:nil];

        cell = [topLevelArray objectAtIndex:0];
    }
于 2013-08-14T09:55:48.997 回答
0

您已经有了关于在单元格外部存储单元格状态的答案,因为它在被回收时会被重置。这些是正确的。

如果所选状态很重要 - 则将其存储在单元格所代表的对象中。这样,如果您基于此对象配置单元格,它将通过回收正确地保留。

如果状态是瞬态的,并且不需要存储在对象中,则需要将此状态存储在某个地方。关于使用 NSArray 存储此状态有几个答案。我个人更喜欢使用以 indexPath 作为键的 NSDictionary。由于 NSIndexPath 符合 NSCopying,它可以用作 NSDictionary 的键。

于 2013-08-14T13:44:00.950 回答
0

您需要单独存储数据,例如在整数数组中。当您显示单元格时,从数组中获取值。

现在您的值存储在标签中,但是当您刷新时,您会丢失该数据并重置为默认值 1。

因此,在您的 cellForTableRow 中,您将标签文本设置为数组中的值。在第二种方法中,您增加存储在数组中的值,然后重新加载数据(或像现在一样手动更改标签。)

于 2013-08-14T09:47:05.147 回答
0

找到了一个解决方案,在 numberOfSectionInTableView 中,我必须根据 tableview 的状态应用条件并相应地更改标签值。我正在使用分页,这就是解决方案。

如果其他人没有在 tableview 中使用分页,那么只需在发送 JSON 请求之前设置一个值并根据 numberOfSectionInTableView 中的值应用条件,它将起作用。

于 2017-10-17T06:18:01.617 回答
0

您的代码正在显示下一个值,因为您在按钮单击时增加了值。

cell.lblCount.text=[NSString stringWithFormat:@"%d", [cell.lblCount.text intValue]+1];

并且 tableView 标签值正在重置为 1,因为每次都会创建新单元格。

您应该需要更多地了解 tableview 的工作原理以及如何使用可重用单元格。看看这篇文章仔细看看表格视图单元格

于 2017-10-17T08:35:05.020 回答