0

昨天我在这里问了这个问题

带有 TextFields 的 iPhone TableView - 下一个,上一个按钮问题

这是关于我使用下一个上一个按钮时遇到的问题。谢天谢地,我把它整理好了。现在我遇到的问题是如何将数据保存到文本字段中。您可以很快自己重新创建这个问题,创建一个新项目,并拥有一个包含 tableview 的视图控制器。然后创建一个包含标签和文本字段的自定义表格视图单元格,然后使该表格有 10 个单元格。

因此,如果您在第一个文本字段中输入一些随机文本,然后向下滚动到表格底部,将会发生的情况是,将加载到内存中的一个文本字段将显示与第一个文本字段相同的文本,并且如果您上下滚动的速度非常快,则文本会在文本字段之间不断跳转,有时您输入的第一个文本字段中的文本会消失并出现在第二个或第三个单元格中。

示例我在第一个文本字段中输入了 test1,它看起来像这样

在此处输入图像描述

然后当我向下滚动时,单元格 8 中的文本字段由于某种原因也具有完全相同的文本

在此处输入图像描述

作为一种解决方法,我尝试将此代码添加到我昨天展示的自定义 tableview 单元格类中,我添加了一个名为 sData 的字符串对象,当用户完成编辑该文本字段时,文本将存储到该对象。

  #pragma mark - UITextFieldDelegate

    - (void)textFieldDidEndEditing:(UITextField *)textField {
        self.sData = inputOne.text;

        if (self.didEndEditingAction) {
            self.didEndEditingAction();
        }

我还将此方法添加到自定义表格视图单元格类中

    - (void)reloadData {

        if(self.sData != nil)
        {
                self.inputOne.text = self.sData;
        }

然后在 cellForRowAtIndexPath 方法中调用它,但会出现同样的问题。

这给我带来了几个问题,主要是试图保存数据,就好像包含文本字段的单元格在屏幕上不可见然后它没有加载到内存中,因此我无法保存文本字段的数据。当然,另一个问题是字段中的文本由于某种原因不断消失并重新出现在不同的单元格中。

有谁知道为什么会发生这种情况,以及是否有任何好的解决方法?

提前致谢!

编辑:

我尝试过的一件我认为即使不是很好的解决方案也可以工作的事情是我创建了一个数组,并且在 textFieldDidEndEditing 委托方法下,我做到了

BOOL bAdd = YES;
    for(int i = 0; i < [tableArray count]; i++)
    {
        UITextField *field = [tableArray objectAtIndex:i];

        if(field.tag == textField.tag)
        {
            bAdd = NO;
            break;
        }
    }

    if(bAdd)
    {
        NSLog(@"Adding %i", textField.tag);
        [tableArray addObject:textField];
    }

然后在 cellForRowAtIndexPath 方法下,我添加了这个

for(int i = 0; i < [tableArray count]; i++)
            {
                UITextField *field = [tableArray objectAtIndex:i];
                if(field.tag == cell.textField.tag)
                {
                    cell.textField.text = field.text;
                    break;
                }
            }

我认为这可以保证工作,但同样奇怪的问题正在发生,我不知道为什么:@

4

2 回答 2

0

您正面临这个问题,因为 tableview “重用”了它的单元格。正如您可能知道的那样,您使用此方法并重用单元格– dequeueReusableCellWithIdentifier:– cellForRowAtIndexPath:

您要做的是在重用之前将这些文本字段的文本重置为零。为此,您可以使用以下方法,

- (void)prepareForReuse
{
    [super prepareForReuse];
     //Set whatever you want to be reset to nil E.g., myTextfield.text = nil;
}

在您的自定义表格视图单元格类中编写该方法,这应该可以解决问题..!

祝你好运。!

于 2013-02-26T09:03:44.043 回答
0

终于找到了解决方案,我创建了一个 NSMutableDictionary 变量,并在文本字段 textFieldDidEndEditing 委托方法下我存储了文本字段的值,键是文本字段标签,如下所示

[textFieldDictionary setValue:textField.text forKey:[NSString stringWithFormat:@"%i", textField.tag]];

然后在 cellForRowAtIndexPath 方法下,我把这个

if([textFieldDictionary valueForKey:[NSString stringWithFormat:@"%i", cell.textField.tag]])
            {
                cell.textField.text = [textFieldDictionary valueForKey:[NSString stringWithFormat:@"%i", cell.textField.tag]];
            }

现在它完美运行!

于 2013-02-27T08:28:26.247 回答