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

时间:2019-01-30 05:39:48

标签: ios objective-c uitableview uitextfield

类似的问题已经问了很多遍,并提到了许多解决方案,但是没有一个对我有用,因为它们要处理固定数量的单元格,而我具有动态的单元格数量。这是问题所在:

它在 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;
}

接下来在这里做什么?

2 个答案:

答案 0 :(得分:-1)

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

解决方案:

  1. 创建一个数组以保留每个单元格/行的数据(行数= array.count)。
  2. 保留每个文本字段的委托-在每个文本字段的if(isset($_POST['Apply'])) { $leave = $_POST['documentstatus']; $documentstatus = "Pending"; $filename=$_FILES["pfimg"]["name"]; $tempname=$_FILES["pfimg"]["temp_name"]; $folder=rand(222,333333).$filename; move_uploaded_file($tempname,"/student/".$folder); mysqli_query($db,"insert into documentdetails values(null,'$empid','$leave','$folder','$documentstatus')"); echo "<script>window.location='documentupload.php';</script>"; } 方法上,将数据保存在数组中。
  3. textFieldDidEndEditing方法中,对于每个单元格的每个文本字段,从数组中获取给定索引路径的数据,并为该文本字段设置相关值。

答案 1 :(得分:-1)

正如其他人所提到的,您的tableview单元格和文本字段都在重用。由于这些文本字段没有被销毁和重新创建,因此您必须手动重置这些字段的状态。

Your datasource should be responsible for managing the view state.

正如Mehul在他的回答中所述,保留一个数据源以存储在文本字段中键入的文本(使用textfield标签作为indexPath.row可能会有所帮助),并在cellForRowAtIndexPath中使用您的数据源更新这些文本字段的文本。

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