滚动UITableView时,自定义单元格中的UITextField文本正在更改

时间:2017-01-19 08:56:16

标签: ios objective-c uitableview uitextfield tableviewcell

如果我在UITableView中拥有大量帐户。当我滚动UITextFid时,我在第一个单元格中编辑的UITableView文本正在重置。由于细胞可重用性,这种情况正在发生。我没有在UITextFid中将我的UITableView文本设置为Indexpath处的cellForRow。由于其他实现,我在自定义单元视图中执行此操作。

你能指导我吗?

STTableViewCell *cell;
cell =  [tableView dequeueReusableCellWithIdentifier:@"STTableViewCell"];

if (cell == nil)
{
    cell = [[STTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"STTableViewCell"];
}

cell.accountNameTxtField.delegate = self

// Fetching the URL from Array at index of indexpath.row
OTPAuthURL *url = [self.authURLs objectAtIndex:indexPath.row];

// Sending the generated authURl and token description to custom STTableViewCell to load the data in a tableView
[(STTableViewCell *)cell setAuthURL:url withtokenDesc:nil];

return cell;

5 个答案:

答案 0 :(得分:1)

您需要维护一个数组,其中的对象数量等于tableview中的项目数。 每个文本字段都应该有一个等于该行的indexPath.row的标记。 e.g:

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
           let cell:CustomUITableViewCell = tableView.dequeueReusableCell(withIdentifier: "customCell")! as CustomUITableViewCell
                cell.textfield = indexPath.row
                cell.textfield.delegate = self
                cell.textfield.text = arrayTemp[indexPath.row] as String
}
    }

使用textfield的委托方法,你将拥有

   public func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool{
     arrary[textfield.tag] = textfield.text
}

在textfield委托方法中,您需要将文本保存在temp数组中,其索引等效于textfield的标记

答案 1 :(得分:0)

您需要将输入的文本存储为输入或失去焦点,一旦单元格被回收,信息就会丢失。使用文本域textfieldDidEndEditing中的委托回调然后当单元格返回视图时,您需要检查文本是否存储在之前并重新填充。

还可以尝试this method来收听编辑活动

答案 2 :(得分:0)

DO cellForRowAtIndexPath中设置值。这就是它的目的。这样做所有这些重复使用的东西就像魅力一样。

我对自定义视图的处理方式是: 在我的自定义视图类中,我创建了一些bind(MyObject myObject)方法(或bind:(MyObject*)myObject respecitly)。 bind方法接收要显示为参数(或多个参数)的对象。 然后bind方法执行所有自定义内容以显示单元格内的对象,以便视图控制器(已实现cellForRowAtIndexPath)保持不受任何自定义视图相关内容的限制,但绑定方法。

我每次都在cellForRowAtIndexPath中调用这种绑定方法。

答案 3 :(得分:0)

看起来一切都按预期工作 - 同时仍然显示该单元格。但是,每当有人从显示屏上消失时,您就会重复使用这些信元,因此信息会丢失。

您需要分离数据模型和显示 - 如果您拥有的只是一个字段的文本,则创建一个String数组(myTableData : [String]),并在cellForRowAt中将textfield设置为{{ 1}}

如果需要在表中填充多个字段,则使用所需内容定义结构(或类),并使用其中的数组填充表

答案 4 :(得分:0)

阐述Pankaj的答案。

您可以像这样更新文本设置方法

- (void)setAuthURL:(OTPAuthURL *)authURL withtokenDesc:(NSString *)tokenDesc andTag:(NSInteger)tag
{
    self.accountNameTxtField.tag = tag;
    self.accountNameTxtField.text = authURL.name;
}

cellForRowAtIndexPath方法,而不是简单地设置文字,也可以用它设置标记。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    STTableViewCell *cell;
    cell =  [tableView dequeueReusableCellWithIdentifier:@"STTableViewCell"];

    if (cell == nil)
    {
        cell = [[STTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"STTableViewCell"];
        cell.accountNameTxtField.delegate = self
    }

    // Fetching the URL from Array at index of indexpath.row
    OTPAuthURL *url = [self.authURLs objectAtIndex:indexPath.row];

    // Sending the generated authURl and token description to custom STTableViewCell to load the data in a tableView, and setting unique tag for textfield
    [(STTableViewCell *)cell setAuthURL:url withtokenDesc:nil andTag:indexPath.row];

    return cell;
}

实施UITextFieldDelegate方法

- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
    //Printing log to check tag
    NSLog(@"Tag = %ld",textField.tag);

    //Update the original array
    self.authURLs[textField.tag] = textField.text;

    //Dismiss keyboard
    [textField resignFirstResponder];

    return YES;
}

希望这有帮助!