我创建了一个包含UIButton
和UILabel
代码在这里:
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.我在这里做错了什么?
答案 0 :(得分:3)
对于customCell,您需要在Xib中指定其重用标识符及其类名,并加载到您的单元格以供重用:
cell = [[[NSBundle mainBundle] loadNibNamed:@"ItemCustomCell" owner:self options:nil] lastObject];
修改强>
最好使用IBOutlet并委托在CustomCell中实现操作,然后使用tag。
//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";
}
答案 1 :(得分:2)
问题是您要从与按钮关联的功能设置标签的值。
当您滚动视图,让细胞消失并重新出现时,控制器会重建您的细胞。
因此,如果您没有保存标签的价值,那么每当您的单元格离开屏幕时,您就会丢失它。
添加内容(如数组)以保存每个标签的值。在增加显示的值的同时增加保存的值。
答案 2 :(得分:0)
例如,您需要将数据分别存储在整数数组中。当你显示单元格从数组中获取值时。
现在您的值存储在标签中,但刷新后会丢失该数据并重置为默认值。
因此,在您的cellForTableRow中,您将标签文本设置为数组中的值。在第二种方法中,您可以增加存储在数组中的值,然后重新加载数据(或像现在一样手动更改标签。)
答案 3 :(得分:0)
在使用来自笔尖的UITableViewCell时,您应该遵循以下方法。
if (cell == nil) {
NSArray *topLevelArray = [[NSBundle mainBundle] loadNibNamed:@"ItemCustomCell" owner:self options:nil];
cell = [topLevelArray objectAtIndex:0];
}
答案 4 :(得分:0)
您已经有了关于将单元格的状态存储在单元格之外的答案,因为它在被回收时会被重置。这些都是正确的。
如果选择的状态很重要 - 则将其存储在单元格所代表的对象中。这样,如果您基于此对象配置单元格,它将通过回收正确保留。
如果状态是暂时的,并且不需要存储在对象中,则需要将此状态存储在某处。关于使用NSArray存储此状态有几个答案。我个人更喜欢使用带有indexPath的NSDictionary作为密钥。由于NSIndexPath符合NSCopying,因此它可以用作NSDictionary的密钥。
答案 5 :(得分:0)
找到一个解决方案,在numberOfSectionInTableView中我必须根据tableview的状态应用一个条件并相应地更改标签值。我正在使用分页,所以这是解决方案。
如果其他人没有在tableview中使用分页,那么只需在发送JSON请求之前设置一个值,并根据numberOfSectionInTableView中的值应用条件,它就会起作用。
答案 6 :(得分:0)
您的代码正在显示下一个值,因为您在按钮点击时正在递增值。
cell.lblCount.text=[NSString stringWithFormat:@"%d", [cell.lblCount.text intValue]+1];
并且tableView标签值重置为1,因为每次都会创建新单元格。
您应该了解更多关于tableview的工作原理以及如何使用可重用单元格。看看这篇文章A Closer Look at Table View Cells