You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 14:36:03