在 UITableViewCells 中的 UITextFields 中维护文本

Posted

技术标签:

【中文标题】在 UITableViewCells 中的 UITextFields 中维护文本【英文标题】:Maintaining text in UITextFields in UITableViewCells 【发布时间】:2013-07-18 01:59:54 【问题描述】:

我的问题:我有一个用于创建列表的 UITableView 部分。每个 TableViewCell 中都有 UITextField。当您开始键入文本字段时,将插入一个新单元格。所有这些功能都可以完美运行。但是,如果用户创建了许多单元格,它们就会离开屏幕并出现问题。特别是该部分顶部的单元格开始被重用。这会导致新单元格中出现不需要的文本,并删除旧单元格中的文本。我该如何解决这个问题?

此问题的图片: (在第二张图片中,当我开始输入第 6 项时,第 1 项出现在其下方)

创建 UITableViewCells 的代码:

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

   static NSString *CellIdentifier = @"AddListInformationCellid";


    UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) 

        // Intialize TableView Cell
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
                                       reuseIdentifier:CellIdentifier];
        cell.accessoryType = UITableViewCellAccessoryNone;
        cell.selectionStyle = UITableViewCellSelectionStyleNone;
        cell.backgroundColor = [UIColor whiteColor];


        // Initialize TextField
         // ... code ommitted for brevity

        // Custome intializiation per each kind of TextField
        if (indexPath.section == 0) 
            playerTextField.tag = 0;
            playerTextField.placeholder = @"Title";
        
        else if (indexPath.section == 1) 

            // Here's where the problem starts *********

            playerTextField.tag = indexPath.row + 1;
            playerTextField.placeholder = @"List Item";
        

            [cell.contentView addSubview:playerTextField];
    


    return cell;

添加/删除单元格的代码

-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string

    NSInteger section = [self.tableView indexPathForCell:(UITableViewCell *)textField.superview.superview].section;
    NSInteger row = [self.tableView indexPathForCell:(UITableViewCell *)textField.superview.superview].row;

    if (section == 0) 

        _myList.name = textField.text;
    
    else if (section == 1) 

        // Delete cell that is no longer used
        if ([string isEqualToString:@""]) 
            if (textField.text.length == 1) 
                if (cellCount > 1) 
                cellCount = cellCount - 1;

                [self.tableView deleteRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:row inSection:1]] withRowAnimation:UITableViewRowAnimationAutomatic];

                textField.text = @"";
                
            
        

        // Add a new cell
        if (self.beganEditing) 
            if (![string isEqualToString:@""]) 
            if (row == [self.tableView numberOfRowsInSection:1] - 1) 
                cellCount = cellCount + 1;
                [self.tableView insertRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:row + 1 inSection:1]] withRowAnimation:UITableViewRowAnimationAutomatic];
                self.beganEditing = NO;
                
            
        
        

    return YES;

【问题讨论】:

【参考方案1】:

正如@Bruno 所说,您需要注意在单元初始化中放入的内容。一个好的一般规则是只将通用规则放入cell == nil 条件中。 任何取决于表格视图中单元格位置的内容都需要超出此if 语句。

在上面的代码中,您有一个注释“每种文本字段的自定义初始化”。这是一个很好的指标,表明此代码需要超出 if 语句。

其次,您不能依赖表格视图单元格来为您保留数据。如果您还没有,则需要保留一个字符串数组,代表文本字段区域中的每个条目。然后当表格视图要求一个单元格时,您可以根据其索引路径设置每个文本字段的文本cell == nil987654325@有条件

也请查看this answer。

希望这会有所帮助!

【讨论】:

【参考方案2】:

你的错误在

if (cell == nil)

部分代码。您没有考虑else,这是重复使用单元格的情况。 (单元格被重复使用,这就是它出现在底部的原因)。

您应该确保您处理重用情况(换句话说,您在重用时相应地配置您的单元格)

【讨论】:

【参考方案3】:

我发现了你的问题。不过有点难说。

试想一下,当表格视图要连续显示一个单元格时,它会在重用队列中选择一个与要显示的单元格类型相同的单元格。换句话说,表格视图只知道它选择的重用单元格的类型,并且单元格的注释由哪一行识别!所以让我们看看你的代码。

你可以知道你只用你的文本创建了一个单元格,当它是 nil 时。但是在使用的时候,同类型的单元格不知道自己在哪一行,也不知道自己的评论是什么,只显示最后的信息!!

这是解决方案。 尝试将您的信息保存在一个组织良好的数组中(例如:您可以通过它所在的行来支持您的信息),基于它的行,尝试通过它与信息数组相关的哪一行来更新您的单元格的注释。

希望能帮到你:)

【讨论】:

以上是关于在 UITableViewCells 中的 UITextFields 中维护文本的主要内容,如果未能解决你的问题,请参考以下文章

在 UITableViewCells 中的 UITextFields 中维护文本

MySQL 中的视图性能

一个NIB中的几个自定义UITableViewCells - 如何在代码中引用?

重新排序 CoreData 中的 UITableViewCells 和对象

如何清除 UITableViewCells 中的 UILabel?

UITableViewCells 中的 UITextFields - 当单元格消失时,文本会消失