Swift iOS开发:如何将用户输入添加到列表数组并同步至TableView
新增页面数据同步到列表页实现方案
问题根因
你当前在AddViewController中操作的countries数组,和列表页TableViewController的数据源数组是两个完全独立的实例,新增的数据仅保存在新增页的局部数组中,不会同步到列表页的数据源,因此列表不会更新。
实现步骤
1. 新增页面添加回调逻辑
在AddViewController类中定义回调闭包,修改提交按钮的点击逻辑,将新增的Country对象通过闭包回传给列表页:
class AddViewController: UIViewController { // 其余原有属性保持不变 // 新增回调属性,用于回传新的Country对象 var addCountryCompletion: ((Country) -> Void)? @IBAction func submitCountryTapped(_ sender: Any) { // 优先做非空校验,避免强制解包引发崩溃 guard let flag = flagTextfield.text, !flag.isEmpty, let name = nameTextfield.text, !name.isEmpty, let region = regionTextfield.text, !region.isEmpty, let population = popTextfield.text, !population.isEmpty else { // 可在此处添加缺省提示,引导用户补全输入 return } let newCountry = Country(flag: flag, name: name, region: region, population: population) // 触发回调传递数据 addCountryCompletion?(newCountry) print("\(flag) \(name) 已添加") // 跳转回列表页:如果是push过来的页面用pop navigationController?.popViewController(animated: true) // 如果是present模态弹出的新增页,用下面的代码关闭 // dismiss(animated: true) } }
记得删除AddViewController中不需要的countries数组相关声明代码。
2. 列表页接收数据并刷新
在列表页TableViewController中重写prepare(for:sender:)方法,跳转时给新增页的回调赋值,接收回传的Country对象后更新数据源、刷新列表:
class TableViewController: UITableViewController { // 你原有的countries数组等属性保持不变 public var countries: [Country] = [ Country(flag: "🇺🇸", name: "United States of America", region: "North America", population: "328.2m"), Country(flag: "🇪🇹", name: "Ethiopia", region: "Horn of Africa", population: "105m"), Country(flag: "🇬🇷", name: "Greece", region: "South Eastern Europe", population: "10.77m"), Country(flag: "🇰🇬", name: "Kyrgystan", region: "Central", population: "6.2m"), Country(flag: "🇻🇦", name: "Vatican City", region: "Europe", population: "1000"), Country(flag: "🇯🇵", name: "Japan", region: "Northwestern Ring of Fire", population: "126.3m"), Country(flag: "🇸🇸", name: "South Sudan", region: "North Africa", population: "11.6m") ] override func prepare(for segue: UIStoryboardSegue, sender: Any?) { // 替换下方的segueID为你在Storyboard/Xib中设置的跳转新增页的segue标识符 if segue.identifier == "跳转到新增页的segueID" { guard let addVC = segue.destination as? AddViewController else { return } // 实现回调逻辑,加weak修饰避免循环引用 addVC.addCountryCompletion = { [weak self] newCountry in self?.countries.append(newCountry) // 刷新列表展示新数据 self?.tableView.reloadData() } } } // 其余原有TableView代理、数据源方法保持不变 }
注意事项
- 必须保证segue的标识符和代码中填写的完全一致,否则回调不会被赋值
- 不要遗漏
tableView.reloadData()调用,仅更新数组不会自动触发列表刷新 - 输入非空校验可根据业务需求调整,也可兼容空输入的场景
内容的提问来源于stack exchange,提问作者Matt.hendo
相关产品推荐
相关产品推荐

