从表格视图中的重复文本字段中保存用户输入?

Posted

技术标签:

【中文标题】从表格视图中的重复文本字段中保存用户输入?【英文标题】:Saving user input from repeating Text Fields in table View? 【发布时间】:2020-06-29 17:09:07 【问题描述】:

我正在尝试编写一个记事卡应用程序,该应用程序允许用户在创建每个记事卡时输入术语和定义(我正在使用 Swift 进行编码)。我创建了一个记事卡的表格视图,用户可以在其中输入每个记事卡的术语和定义。我正在通过 Realm 保存他们的数据。 目前,我可以保存他们添加的记事卡数量。但是,我无法弄清楚如何保存他们对每张笔记卡的术语和定义的输入(我要求用户通过术语的文本字段和定义的文本字段进行输入)。 因为我必须为 UITableViewCell 创建另一个类(以避免插座无法连接到重复内容错误),所以我无法访问 CreateNewSetTableViewController 中的 termTextField 和 defTextField,因此无法保存或对用户数据执行任何操作。 任何帮助将不胜感激,我已经尝试解决这个问题大约 2 天了。非常感谢:)

import UIKit
import RealmSwift


class NotecardTableViewCell: UITableViewCell 
    @IBOutlet weak var termTextField: UITextField!
    @IBOutlet weak var defTextField: UITextField!



class CreateNewSetTableViewController: UITableViewController 
    var noteCards: Results<Notecard>?
    let realm = try! Realm()
    override func viewDidLoad() 
        super.viewDidLoad()
        tableView.separatorStyle = .none
        loadNotecards() //load up all the categories currently owned
    
    

    //MARK: - Navigation Bar Methods
    
    @IBAction func addButtonPressed(_ sender: UIBarButtonItem) 
        let newItem = Notecard()
        newItem.term = "wooho"
        newItem.def = "asdf"
        self.save(notecard: newItem)
        tableView.reloadData()
    
    
    @IBAction func doneButtonPressed(_ sender: UIBarButtonItem) 
        _ = navigationController?.popToRootViewController(animated: true)
    
    
    
    //MARK: - Data Manipulation Methods
    
    func save(notecard: Notecard)
        do 
            try realm.write
                realm.add(notecard)
            
        
        catch
            print (error)
        
        tableView.reloadData()
    
    
    func loadNotecards()
        noteCards = realm.objects(Notecard.self)
        tableView.reloadData()
    
    
    // MARK: - Table view data source
    
    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
        return noteCards?.count ?? 1
    
    
    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
        let cell = tableView.dequeueReusableCell(withIdentifier: "NotecardCell", for: indexPath) as! NotecardTableViewCell
        return cell
    
    

【问题讨论】:

【参考方案1】:

您可以通过一些不同的方式检索:

    访问单元格值并向下转换为单元格的类型:

    @IBAction func addButtonPressed(_ sender: UIBarButtonItem) 
        guard let cell = tableView.cellForRow(at: indexPath) as? NotecardTableViewCell else  return 
        let newItem = Notecard()
        newItem.term = cell.termTextField.text
        newItem.def = cell.defTextField.text
        self.save(notecard: newItem)
        tableView.reloadData()
    
    

我不推荐这种方式,因为如果单元格未显示,您将无法检索到正确的值,因为它正在被重复使用。

    您可以为 UITextFields 设置标签,并通过委托 UITextFieldDelegate 访问 textField 输入:

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
        let cell = tableView.dequeueReusableCell(withIdentifier: "NotecardCell", for: indexPath) as! NotecardTableViewCell
        cell.termTextField.delegate = self
        cell.termTextField.tag = 0 // Tag was set to demonstrate how it works, you can set it as the indexPath.row
        cell.defTextField.delegate = self
        cell.defTextField.tag = 1
        return cell
    
    
    
    func textFieldDidEndEditing(_ textField: UITextField) -> Bool 
         if textField.tag == 0  
         // Retrieve Term text
          else if textField.tag == 1 
         // Retrieve def text
         
    
    

【讨论】:

以上是关于从表格视图中的重复文本字段中保存用户输入?的主要内容,如果未能解决你的问题,请参考以下文章

用户输入不适用于在表格视图中以编程方式添加的文本字段

文本字段标签和表格视图

从 Swift (3.1) 表格视图中动态创建的单元格获取有序的文本字段数据

用户输入的值保存到 Core Data (?) 但未出现在表视图中

多年来在 IOS 中自动完成文本字段

从android中的对话框保存EditText