2017-09-25 56 views
0

我正在使用UItextfieldUItextview当我在textview和textfield中键入内容并在tableview中滚动时,数据将消失,有时textfield和textview中的数据会重复。在tableview中滚动后,UITextField和UITextView消失了吗?

代码:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 

    { 
    var cell = table_view_one.dequeueReusableCell(withIdentifier: "first_cell", for: indexPath) as! first_cell 
    if(indexPath.row>0) 
    { 
     cell.add_new_btn.setImage(UIImage(named:"close"), for: .normal) 
    } 
    cell.delegate = self return cell 
    } 

UITextField and UITextView disappears after scrolling in tableview

+1

请在您的问题中包含有问题的代码。 –

+0

由于'UITableViewCell'被重用,您的问题就出现了。您绝不应该将数据存储在表格视图单元格中,您应该将文本视图和文本字段中的所有数据保存到外部数据结构(如数组)中,并将其用作表视图的数据源。 但是,如果没有看到实际用于处理用户输入的代码,我无法给出明确的答案来显示要使用的实际代码。 –

回答

0

同时重用它再次创建在一些情况下,相同的新的存储器的单元分配数组的值。因此,属于该单元的所有小部件和组件显然将再次出生。为了保持小部件以前的状态,需要通过保持旧的状态数据来每次都将旧状态设置为新创建的小部件。

在你的情况下,它需要通过单元格中的协议方法来保存在TextField或TextView中输入的文本。以下是实现此目的的简要方法。每次

protocol CellDelegate { 
    func textFieldText(cell: UITableViewCell, text: String) 
} 

2.Trigger委托方法时文本得到更新:

Cell.swift

1.创建一个协议到文本传递到ViewController等。如果您拨打textFieldShouldEndEditing中的方法,则会漏掉一个案例,例如,假设您在键盘中输入文本时没有轻按返回按钮(如果可用于保存按钮),并且如果点击该按钮,事件将不会发生,因此实际文本在持久模型中没有更新。所以,最好是调用该委托每次文本正在改变,shouldChangeCharactersInRange方法在这种情况下选择,实施将是这样的:

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { 
     let result = (textField.text as NSString?)?.replacingCharacters(in: range, with: string) ?? string 
     delegate.textFieldText(self, text: result) 
    } 

ViewController.swift

1。在控制器中创建一个局部变量来保存每个文本字段或TextView的数据,如:

var textFieldText = "" 

2.In cellForRowAt方法分配委托的单元格,更新文字像下面,所以每次被新建小区将更新先前输入的textField文本。

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 

    var cell...... 

    cell.delegate = self 
    cell.textField.text = textFieldText 

return cell 
} 

3.In每一次细胞委托方法执行更新的文字,在这里我们有一个说法小区通过了解indexPath确定当前单元格是有用的。

func textFieldText(cell: UITableViewCell, text: String) { 
    let indexPath = tableView.indexPathForCell(cell) 
    textFieldText = text 
} 
0

问题: 必须是要重复使用的细胞,不保存文本字段的值(您键入)。 解决方案: 保存您正在输入的文本,然后在您将其重新出队时将其传回给单元格。

+0

是啊@Bence我不保存textfield值..我可以保存TextEndEditing()方法中的textfield值吗? –

+1

将其保存在此方法中,然后无论按下回车键,都将保存所有键入的字符,然后返回true。 textField(_:shouldChangeCharactersIn:replacementString :) –

+0

如何将文本字段值传递给单元格,如果我再次将它分离出来 –

-1

@BencePattogato答案是正确的。

另一种解决方案是,以节省电池作为本地属性,并且不重新使用(重新创建)一个更多的时间时表视图将尝试显示此细胞:

private var yourLocalCell: first_cell? 

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 

    // Do some additional check here if this is time to display first_cell 

    if let cell = yourLocalCell { 
     return cell 
    } 

    var cell = table_view_one.dequeueReusableCell(withIdentifier: "first_cell", for: indexPath) as! first_cell 
    if(indexPath.row>0) 
    { 
     cell.add_new_btn.setImage(UIImage(named:"close"), for: .normal) 
    } 
    cell.delegate = self 
    yourLocalCell = cell 
    return cell 
    } 
+0

Thanx @anatoliy_v我试过了,但是我的单元格(所有数据)滚动后消失。 –

+0

这可以做到,但如果你的tableview会有很多行,这是浪费内存。 iOS表格/ collectionviews的构建是为了与重复使用的单元格一起使用 –

+0

同意,解决方案仅在行数有限的文本字段时才适用。 @asifsaifi。那么很高兴看到你的单元代码。 –

0

可以创建包含该数组文本编写的文本。首先,启动具有单元数量容量的数组,并向每个索引添加空字符串。

然后,在textFieldDidEndEditing的任何文本字段中写入时,通过从点(textfield)获取单元索引,将文本保存到适当索引处的数组。

在cellForRow只是根据indexPath.row

+0

我应该在哪里调用textFieldDidEndEditing方法(在单元格类或控制器类中),因为我无法在控制器类中获取textFieldDidEndEditing的结果。我只能在单元格类 –

+0

中为textfield添加委托并在单元类中调用它,因为textfield仅在单元格中。 –

+0

那么如何将这个文本框的数据传递给控制器​​的textfieldarray –