XCode TableView TextFields输入奇怪的数据行为

时间:2013-02-26 08:52:04

标签: objective-c xcode uitableview

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

iPhone TableView with TextFields - next, previous button issue

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

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

示例我将test1输入到第一个文本字段中,它看起来很像

enter image description here

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

enter image description here

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

  #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;
                }
            }

我认为这可以保证有效,但是同样的奇怪问题正在发生,我不明白为什么:@

2 个答案:

答案 0 :(得分:0)

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

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

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

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

祝你好运。!

答案 1 :(得分: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]];
            }

现在它完美无缺!!