如何根据标签存储文本。
我在UITextField
中使用了UITableViewCell
。
我的视图控制器:-
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let identifier = "Cell"
var cell: NH_QuestionListCell! = tableView.dequeueReusableCell(withIdentifier: identifier) as? NH_QuestionListCell
if cell == nil {
tableView.register(UINib(nibName: "NH_QuestionListCell", bundle: nil), forCellReuseIdentifier: identifier)
cell = tableView.dequeueReusableCell(withIdentifier: identifier) as? NH_QuestionListCell
}
cell.contentView.backgroundColor = UIColor.clear
cell.textadd = {[weak self] in
if let i = self?.tableview.indexPath(for: $0) {
print("the selected text\(cell.textname ?? "")")
print(i)
print("the Selected button is \(cell.textname ?? "")")
print(i)
cell.setText(Options:(self?.questionViewModel.datafordisplay(atindex: indexPath))!)
let model = self?.questionViewModel.datafordisplay(atindex: indexPath)
print(model?.values ?? "")
if model?.isSelected == true{
cell.texttype.tag = indexPath.row
// cell.texttype.text = questionViewModel.datafordisplay(atindex: indexPath)
}
return cell
}
tableviewcell:-
@IBOutlet weak var texttype: UITextField!
var textname:String?
var textadd : ((NH_QuestionListCell) -> Void)?
@IBAction func TextAction(_ sender: UITextField) {
print(texttype.text)
// self.question.text = texttype.text
let index = texttype.tag
self.textname = texttype.text
self.textname = texttype.text
print(self.textname)
print(texttype.text)
textadd?(self)
}
func setText(Options:NH_OptionsModel)
{
self.displaySmiley.isHidden = true
self.viewdisplay.isHidden = false
self.imagebutton.isHidden = true
self.question.isHidden = true
self.displayRatingView.isHidden = true
print(Options.values)
Options.values = self.textname
print(Options.values)
}
func textFieldDidBeginEditing(_ textField: UITextField) {
texttype.text = ""
}
func textFieldShouldClear(_ textField: UITextField) -> Bool
{
return true
}
func textFieldDidEndEditing(_ textField: UITextField) {
self.TextAction(texttype)
}
func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
return true;
}
func textFieldShouldEndEditing(_ textField: UITextField) -> Bool {
return true;
}
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
print(texttype.text)
texttype.resignFirstResponder()
return true
}
我得到了输出。在第一个单元格中,我在文本字段中键入了一些文本,然后点按“输入”。然后我滚动。那时我发现我键入的文本在其他单元格中可用。如何解决此问题?
答案 0 :(得分:0)
您不需要使用单元格Float64
,因为您正在为每个单元格使用闭包来处理文本字段更新;此闭包将捕获tag
,因此您知道要更新的行。可能出现的唯一问题是,是否允许通过单元格移动或通过插入/删除单元格的功能对单元格进行重新排序。在这种情况下,捕获的indexPath
将变得无效(这与使用indexPath
时遇到的问题相同)。您可以通过在闭包中调用tag
来解决此问题,以在闭包执行时获取单元格的索引路径。
滚动时显示文本的原因是因为单元格对象被重复使用,并且您未明确设置文本字段文本。
最后,您可以避免整个indexPath(for:)
的跳动,因为释放视图控制器时,将释放表视图,这意味着将释放单元格。通过使用闭包,您没有保留周期。
weak self
注意,您还没有提供有关如何更新模型对象的详细信息,因此我插入了一个函数调用来显示该想法。
我还建议您阅读Swift约定。使用大写字母表示参数名称以及使用func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let identifier = "Cell"
var cell: NH_QuestionListCell! = tableView.dequeueReusableCell(withIdentifier: identifier) as? NH_QuestionListCell
if cell == nil {
tableView.register(UINib(nibName: "NH_QuestionListCell", bundle: nil), forCellReuseIdentifier: identifier)
cell = tableView.dequeueReusableCell(withIdentifier: identifier) as? NH_QuestionListCell
}
cell.contentView.backgroundColor = UIColor.clear
cell.setText(options: self.questionViewModel.datafordisplay(atindex: indexPath))
cell.textadd = {
self.questionViewModel.setData(atIndex: indexPath,text: cell.textName)
}
return cell
}
作为类前缀不是“ Swifty”