dequeueReusableCellWithIdentifier:CellIdentifier如何避免它

时间:2014-03-30 22:31:27

标签: ios uitableview

我正在使用表视图来显示来自服务器的已加载文本字段数组,因此我有一个表视图列表的字段,当我填写此数据字段并向下滚动以填充其他字段时,我再次向上滚动发现值发生了变化,并且存在重复的值

-(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中的问题是因为它重新分配并分配了单元格,但是我不想这样做我想让内存中的每一个东西都带有它的值

2 个答案:

答案 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值存储在模型中