Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/107.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 滚动时在UITableView中重复的文本字段值_Ios_Objective C_Uitableview_Uitextfield - Fatal编程技术网

Ios 滚动时在UITableView中重复的文本字段值

Ios 滚动时在UITableView中重复的文本字段值,ios,objective-c,uitableview,uitextfield,Ios,Objective C,Uitableview,Uitextfield,类似的问题已经问过很多次了,也提到过很多解决方案,但没有一个对我有效,因为它们涉及固定数量的单元格,而我有动态数量的单元格。问题是: 它在Objective-C中。我有一个动态行数的tableview,用户可以根据需要添加更多单元格或删除单元格,每行包含3个文本字段,最后我想从这些文本字段中获取数据并保存它们。从所有文本字段中获取数据工作得很好,但当我将数据添加到任何第3行文本字段中时,当我滚动它时,它会重复,这是一个主要问题 以下是代码: -(void)textFieldDidEndEditi

类似的问题已经问过很多次了,也提到过很多解决方案,但没有一个对我有效,因为它们涉及固定数量的单元格,而我有动态数量的单元格。问题是:

它在Objective-C中。我有一个动态行数的tableview,用户可以根据需要添加更多单元格或删除单元格,每行包含3个文本字段,最后我想从这些文本字段中获取数据并保存它们。从所有文本字段中获取数据工作得很好,但当我将数据添加到任何第3行文本字段中时,当我滚动它时,它会重复,这是一个主要问题

以下是代码:

-(void)textFieldDidEndEditing:(UITextField *)textField{
    if ([_txtNumbers resignFirstResponder]) {
        totalIndex = [_txtNumbers.text integerValue];
        [_tblContacts reloadData];
    }
}

- (IBAction)onAddCellClicked:(id)sender {
    totalIndex = [_txtNumbers.text integerValue];
    totalIndex = totalIndex + 1;
    _txtNumbers.text = [NSString stringWithFormat:@"%ld",(long)totalIndex];
    [_tblContacts reloadData];
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return totalIndex;
}

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

    static NSString *CellIdentifier = @"InviteEmailTableViewCell";

    InviteEmailTableViewCell *cell = [self.tblContacts dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

    cell.txtName.delegate = self;
    cell.txtTell.delegate = self;
    cell.txtEmail.delegate = self;

    UIToolbar  *numberToolbar = [[UIToolbar alloc]initWithFrame:CGRectMake(0, 0, 320, 50)];
    [numberToolbar setTintColor:kShadowColor1];
    [numberToolbar setBarTintColor:[UIColor blackColor]];
    numberToolbar.items = [NSArray arrayWithObjects:
                           [[UIBarButtonItem alloc]initWithTitle:@"Cancel" style:UIBarButtonItemStyleBordered target:self action:@selector(cancelNumberPad:)],
                           [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil],
                           [[UIBarButtonItem alloc]initWithTitle:@"Done" style:UIBarButtonItemStyleDone target:self action:@selector(doneWithNumberPad:)],
                           nil];
    cell.txtTell.inputAccessoryView = numberToolbar;

    [cell.txtName setTag:indexPath.row];
    [cell.txtTell setTag:indexPath.row];
    [cell.txtEmail setTag:indexPath.row];

    return cell;
}

接下来要做什么?

随着文本字段被重用,很明显输入的值将被重复

解决方案:

创建一个数组以保留每个单元格/行的数据,行数=array.count。 保留每个textfield的委托-在每个textfield的textfielddidediting方法中,将数据保存在数组中。 在CellForRowatineXpath方法中,对于每个单元格的每个textfield,从给定indexpath的数组中获取数据,并为该textfield设置相关值。
正如其他人所提到的,您的tableview单元格和文本字段都被重用。由于这些文本字段不会被销毁和重新创建,因此必须手动重置这些字段的状态

您的数据源应该负责管理视图状态

正如Mehul在他的回答中提到的,保留一个数据源来存储在textfield中键入的文本,使用textfield标记indexPath.row可能会有所帮助,而在cellForRowAtIndexPath中,使用数据源更新这些textfield的文本


这种方法确保了视图和数据源之间的同步。

重用问题。这些应该会有帮助,在自定义单元格类中重写tableview单元格的perpareForReuse方法,并重置此方法中的textfields falues。@vivekDas感谢您的响应,这是在objC中,我尝试过重写它,但没有成功。如果您能告诉我如何在objC中执行此操作,这将非常有帮助。您迄今为止为perpareForReuse所做的尝试将显示谢谢你的回答,但我还是很困惑,因为我尝试了很多东西,所以可能是因为困惑,我无法注意到你到底在说什么。如果可能的话,你能告诉我要遵循的步骤吗?我知道您已经编写了步骤,但我不清楚对不起。首先了解您的问题,为什么会出现此问题。你知道这行“dequeueReusableCellWithIdentifier”是什么意思吗?它只是意味着——将被隐藏的单元格将再次被重用。所以,很明显,您已经填充的textfield值将被重复。所以,您不能依赖tableview来存储数据。所以,你必须创建一个数组来保存数据。所以我应该将数据保存到textfielddidediting中的数组中,对吗?您提到将委托添加到textfielddidediting中,那么我是否应该将其从cellforrowatinedexpath中删除?当前委托非常好。。我只是告诉你-1。每当任何textfild的值发生更改时—将新值保存到数组中,2。在cellForRowAtIndexPath方法中,从数组中获取相应的值并设置到相关的textfield中。是的,我理解,但情况是我在单元格中有3个textfield,单元格的数量可以增加或减少。@Mr.Desai:您可以根据您增加或减少的单元格来增加或减少更新数组。