如何在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添加到SecondView控制器中的tableView

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

当我打印项目Array.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作为表视图数据源和委托。您只需要将寄存器视图控制器实例传递给表视图,而不需要传递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
}
}

最新更新