我正在使用表视图来显示来自服务器的已加载文本字段数组,因此我有一个表视图列表的字段,当我填写此数据字段并向下滚动以填充其他字段时,我再次向上滚动发现值发生了变化,并且存在重复的值
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"FieldCell";
//FieldCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
FieldCell *cell = [[FieldCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
//Filling The DataHere
cell.cellImage.image = [UIImage imageNamed:[images objectAtIndex:indexPath.row]];
cell.cellTextField.placeholder = [placeHolders objectAtIndex:indexPath.row] ;
// Configure the cell...
cell.selectionStyle = UITableViewCellSelectionStyleNone;
cell.backgroundColor = [UIColor clearColor];
return cell;
}
我认为dequeueReusableCellWithIdentifier:CellIdentifier中的问题是因为它重新分配并分配了单元格,但是我不想这样做我想让内存中的每一个东西都带有它的值
答案 0 :(得分:3)
你的cellForRowAtIndexPath
负责获取一个单元并将正确的值放入其中 - 这就是我要求你展示整个方法的原因。您在问题中添加的代码不是完整的cellForRowAtIndexPath
方法。
更新 - 我已经从单元格到tableview包含一个简单的委托回调,以允许单元格中的UITextField委托更新后备存储。我没有为委托使用适当的协议,因为我想快速将它们放在一起。
FieldCell.h
@class TableView
@property (strong,nonatomic) TableView *delegate;
@property (strong,nonatomic) NSIndexPath indexPath;
@property (strong,nonatomic) UITextField *textField;
FieldCell.c
#import <TableView.h>
#pragma mark -
#pragma mark UITextFieldDelegate
- (BOOL) textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
if (self.delegate)
{
[self.delegate updateCellText:[textField.text stringByReplacingCharactersInRange:range withString:string] forIndexPath:self.indexPath;
}
return YES;
}
TableView.h
@property (strong,nonatomic) NSMutableArray *cellTexts; // You need to initialise this as an array full of empty NSStrings or whatever the initial cell values should be
- (void) updateCellText:(NSString *)text forIndexPath:(NSIndexPath)indexPath;
TableView.c
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"FieldCell";
FieldCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
cell.indexPath=indexPath;
cell.delegate=self;
cell.textField.text=[self.cellTexts objectAtIndex:indexPath.row]; // modify this as required to actually put your data to be displayed into the cell's properties
return cell;
}
- (void) updateCellText:(NSString *)text forIndexPath:(NSIndexPath)indexPath
{
[self.cellTexts replaceObjectAtIndex:indexPath.row withObject:text];
}
答案 1 :(得分:3)
回答你的问题
dequeueReusableCellWithIdentifier:CellIdentifier如何避免它?
FieldCell *cell = [[FieldCell alloc]init];
这会为每个单元格分配内存,但不会重复使用它们......
无论如何,请不要这样做,它会给你一个糟糕的性能记忆,你甚至会注意到滚动表时的滞后。
问题的真正的解决方案不是依赖于单元格内容,因为它们被重用,而是您应该设置在输入模型时将UITextfield
值存储在模型中