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
}
}
大家好,我有一个关于每次按下按钮时将新元素追加到数组中的问题。我有两个视图控制器,第一个“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
}
}