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

iOS动态TableView:可编辑TextField/TextView的Cell数据同步与提交指南

动态TableViewCell编辑与数据提交实现方案

第一步:定义匹配服务器数据的模型

先创建对应服务器JSON结构的模型类,将可编辑字段设为变量,方便后续修改:

struct RecordModel: Codable {
    let slNo: Int
    let date: String
    let someContent: String
    // 可编辑的两个字段
    var time: String
    var recordText: String
    
    // 与服务器JSON字段映射,可根据实际返回结构调整
    enum CodingKeys: String, CodingKey {
        case slNo = "sl_no"
        case date
        case someContent = "some_content"
        case time
        case recordText = "record_text"
    }
}

第二步:用数据源驱动TableView,替换硬编码

在ViewController中声明数据源数组,请求服务器数据后解析为模型数组:

var records: [RecordModel] = []

// 服务器请求完成后的解析逻辑示例
func fetchServerData() {
    // 此处编写网络请求代码,拿到responseData后执行解析
    let decoder = JSONDecoder()
    do {
        records = try decoder.decode([RecordModel].self, from: responseData)
        DispatchQueue.main.async {
            self.tableView.reloadData()
        }
    } catch {
        print("JSON解析失败: \(error)")
    }
}

修改cellForRowAt方法,从数据源取数据赋值,不再硬写固定内容:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "RecordCell", for: indexPath) as! RecordCell
    
    // 静态文本配置可移至Cell初始化方法,避免重复代码
    cell.sl.text = "Sl No."
    cell.Date.text = "Date:"
    cell.time.text = "Time:"
    cell.some.text = "Some"
    cell.record.text = "Record"
    cell.txtVw.layer.borderColor = UIColor.lightGray.cgColor
    cell.txtVw.layer.borderWidth = 1
    
    // 从数据源取数据赋值
    let model = records[indexPath.row]
    cell.nosl.text = "\(model.slNo)"
    cell.Datee.text = model.date
    cell.timeetxt.text = model.time
    cell.somee.text = model.someContent
    cell.txtVw.text = model.recordText
    
    // 绑定编辑回调,实时更新数据源(闭包方式比tag更可靠,避免复用问题)
    cell.onTimeUpdated = { [weak self] newTime in
        guard let self = self else { return }
        self.records[indexPath.row].time = newTime
    }
    
    cell.onRecordTextUpdated = { [weak self] newText in
        guard let self = self else { return }
        self.records[indexPath.row].recordText = newText
    }
    
    return cell
}

设置TableView的行数:

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return records.count
}

第三步:给自定义Cell添加编辑监听回调

在自定义Cell中定义闭包,监听TextField和TextView的输入变化:

class RecordCell: UITableViewCell {
    // 关联你的IBOutlet控件:sl、Date、time、some、record、nosl、Datee、timeetxt、somee、txtVw
    
    // 编辑回调闭包
    var onTimeUpdated: ((String) -> Void)?
    var onRecordTextUpdated: ((String) -> Void)?
    
    override func awakeFromNib() {
        super.awakeFromNib()
        setupEditListeners()
    }
    
    private func setupEditListeners() {
        // 监听时间TextField输入变化
        timeetxt.addTarget(self, action: #selector(timeTextChanged(_:)), for: .editingChanged)
        // 监听记录TextView输入变化
        txtVw.delegate = self
    }
    
    @objc private func timeTextChanged(_ textField: UITextField) {
        onTimeUpdated?(textField.text ?? "")
    }
}

extension RecordCell: UITextViewDelegate {
    func textViewDidChange(_ textView: UITextView) {
        onRecordTextUpdated?(textView.text ?? "")
    }
}

第四步:提交按钮逻辑,将数据发回服务器

点击提交按钮时,将数据源数组转为JSON,发送POST请求到服务器:

@IBAction func submitButtonTapped(_ sender: UIButton) {
    // 将模型数组转为JSON数据
    let encoder = JSONEncoder()
    encoder.keyEncodingStrategy = .convertToSnakeCase // 若服务器使用蛇形命名字段则开启
    do {
        let jsonData = try encoder.encode(records)
        
        // 构建请求
        guard let url = URL(string: "你的服务器提交接口地址") else { return }
        var request = URLRequest(url: url)
        request.httpMethod = "POST"
        request.setValue("application/json", forHTTPHeaderField: "Content-Type")
        request.httpBody = jsonData
        
        // 发送请求
        let task = URLSession.shared.dataTask(with: request) { data, response, error in
            if let error = error {
                print("提交失败: \(error)")
                return
            }
            
            // 处理服务器响应
            if let httpResp = response as? HTTPURLResponse, httpResp.statusCode == 200 {
                DispatchQueue.main.async {
                    // 提交成功,给用户提示
                    let alert = UIAlertController(title: "成功", message: "数据已提交", preferredStyle: .alert)
                    alert.addAction(UIAlertAction(title: "确定", style: .default))
                    self.present(alert, animated: true)
                }
            } else {
                print("提交失败,状态码异常")
            }
        }
        task.resume()
        
    } catch {
        print("JSON编码失败: \(error)")
    }
}

额外注意事项

  • 若需限制时间TextField的输入格式(如只能输入HH:mm),可在Cell的timeTextChanged方法中做校验,或通过TextField代理方法textField(_:shouldChangeCharactersIn:replacementString:)过滤非法输入。
  • 所有UI操作必须在主线程执行,网络请求回调中更新UI需切换到主线程。
  • 确保Cell的复用标识符已正确注册,如在viewDidLoad中调用tableView.register(RecordCell.self, forCellReuseIdentifier: "RecordCell")(若为xib创建的Cell,使用register(nib:forCellReuseIdentifier:))。

内容的提问来源于stack exchange,提问作者srsstyle

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 15:14:59