在UITableViewCells中维护UITextFields中的文本

时间:2013-07-18 01:59:54

标签: iphone ios objective-c uitableview uitextfield

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

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

enter image description here

enter image description here

创建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;
}

3 个答案:

答案 0 :(得分:4)

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

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

其次,您不能依靠表格查看单元格来保存您的数据。如果您还没有,则需要保留一个字符串数组,表示文本字段区域中的每个条目。然后,当通过表格视图询问单元格时,您可以根据 cell == nil 条件之外的索引路径设置每个文本字段的文本。

同时查看this answer

希望这有帮助!

答案 1 :(得分:3)

你的错误就在

if (cell == nil)

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

你应该确保你处理重用案例(换句话说,你重复使用时配置你的单元格)

答案 2 :(得分:1)

我找到了你的问题。但这有点难以说清楚。

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

您可以知道,只有nil时,您才会使用您的文本创建一个单元格。然而,当它将被使用时,具有相同类型的单元格不知道它在哪一行,因此它不知道它所持有的是什么类型的注释,并且只是呈现了它的最后一次信息!

这是解决方案。 尝试将您的信息保存在一个组织良好的数组中(例如:您可以通过其中的哪一行返回您的信息),基本在其行上,尝试更新您的单元格的注释,其中哪一行与info-array相关。

希望它可以提供帮助:)