Swift 如何从另一个视图控制器将元素追加到数组中

How to append elements into an array from another View Controller in Swift

大家好,我有一个关于每次按下按钮时将新元素追加到数组中的问题。我有两个视图控制器,第一个“RegisterViewController”,它包含一个文本字段和一个按钮。

@IBAction func didTapSave(_ sender: UIButton) {
    usernameText.endEditing(true)
    userText = usernameText.text ?? ""
    performSegue(withIdentifier: "goToData", sender: self)    
}

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "goToData" {
        let destinationVC = segue.destination as! UserTableViewController
        destinationVC.userData = userText
        destinationVC.saveItems()
}

想法是将 texfield.text 添加到 SecondViewcontroller

中的 tableView

到目前为止,我可以附加一个 textfield.text,然后当我返回 RegisterViewController 并使用不同的文本重试时,我用于 tableView 的数组只是“编辑”了最后一个字符串但没有添加另一个元素。

当我打印 itemArray.count 时,它始终为 0,这意味着只有一个文本,但如果我继续在文本字段上书写,则不会添加其他文本

class UserTableViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { 
    var userData : String?
    var itemArray = [Item]()
    @IBOutlet weak var tableView: UITableView!
    override func viewDidLoad() {
        super.viewDidLoad()
        tableView.delegate = self
        tableView.dataSource = self
        saveItems()
    }
    func saveItems() {
        let newItem = Item(userRegister: userData ?? "")
        itemArray.append(newItem)
        print(itemArray.count)
        tableView.reloadData()
    }
}

原因是每次加载 UserTableViewController 时都会创建一个新的 itemArray。解决此问题的最简单方法是使 RegisterViewController 您的 table 视图数据源和委托。您只需要将注册视图控制器实例传递给您的 table 视图,而不是传递 userData。像这样尝试:

class RegisterViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
    @IBOutlet weak var usernameText: UITextField!
    var items: [Item] = []
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        items.count
    }
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cellID", for: indexPath)
        var content = cell.defaultContentConfiguration()
        content.text = items[indexPath.row].userRegister
        cell.contentConfiguration = content
        return cell
    }
    @IBAction func didTapSave(_ sender: Any) {
        usernameText.endEditing(true)
        items.append(.init(userRegister: usernameText.text!))
        performSegue(withIdentifier: "goToData", sender: self)
    }
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "goToData" {
            let destinationVC = segue.destination as! UserTableViewController
            destinationVC.registerViewController = self
        }
    }
}

还有你的 UserTableViewController:

class UserTableViewController: UIViewController {
    @IBOutlet weak var tableView: UITableView!
    var registerViewController: RegisterViewController?
    override func viewDidLoad() {
        super.viewDidLoad()   
        tableView.register(UITableViewCell.self, forCellReuseIdentifier: "cellID")
        tableView.delegate = registerViewController
        tableView.dataSource = registerViewController
    }
}