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

从TableViewCell行获取客户子键并传递至ViewController生成新订单键

解决方案:传递客户键并生成新订单

没问题,我来帮你一步步实现这个需求!咱们分三个核心步骤来完成:

1. 在CustomerViewController中获取选中客户的子键并跳转

首先,你需要在UITableView的行点击事件里,拿到对应客户的子键,然后把它传递给OrderAddViewController。假设你的数据源是一个存储客户信息的数组(比如var customers: [Customer] = [],其中Customer类包含key属性),代码可以这么写:

// CustomerViewController.swift
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    // 获取选中的客户模型
    let selectedCustomer = customers[indexPath.row]
    // 获取客户子键
    let customerKey = selectedCustomer.key
    
    // 实例化OrderAddViewController(根据你的初始化方式调整)
    // 方式1:如果用Storyboard
    let storyboard = UIStoryboard(name: "Main", bundle: nil)
    guard let orderAddVC = storyboard.instantiateViewController(withIdentifier: "OrderAddViewController") as? OrderAddViewController else { return }
    
    // 方式2:如果是代码初始化
    // let orderAddVC = OrderAddViewController()
    
    // 传递客户键
    orderAddVC.targetCustomerKey = customerKey
    
    // 跳转页面(根据你的导航方式调整,比如push或present)
    navigationController?.pushViewController(orderAddVC, animated: true)
    
    // 取消选中状态
    tableView.deselectRow(at: indexPath, animated: true)
}

2. 在OrderAddViewController中接收客户键

接下来,在OrderAddViewController里定义一个属性来接收传递过来的客户键:

// OrderAddViewController.swift
import UIKit

class OrderAddViewController: UIViewController {
    // 用于接收客户子键的属性
    var targetCustomerKey: String!
    
    // 其他代码...
}

如果是用Storyboard的segue跳转,你也可以在prepare(for:sender:)方法里传递:

// CustomerViewController.swift
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "GoToOrderAdd" {
        guard let orderAddVC = segue.destination as? OrderAddViewController,
              let selectedIndexPath = tableView.indexPathForSelectedRow else { return }
        let selectedCustomer = customers[selectedIndexPath.row]
        orderAddVC.targetCustomerKey = selectedCustomer.key
    }
}

3. 在客户键下生成新订单键并添加字段

最后,当你在OrderAddViewController中准备创建订单时(比如用户点击“保存订单”按钮),就可以用targetCustomerKey来定位到对应的客户节点,生成新的订单键并写入字段。假设你用的是Firebase Realtime Database(如果是其他数据库,逻辑类似,只是API不同),代码示例如下:

// OrderAddViewController.swift
import FirebaseDatabase

// 假设你有一个保存订单的按钮点击事件
@IBAction func saveOrderTapped(_ sender: UIButton) {
    // 确保客户键已正确传递
    guard let customerKey = targetCustomerKey else {
        print("客户键未传递!")
        return
    }
    
    // 构造订单数据(根据你的需求定义字段)
    let orderData: [String: Any] = [
        "orderNumber": "ORD-\(UUID().uuidString.prefix(8))",
        "orderDate": Date().timeIntervalSince1970,
        "totalAmount": 99.99,
        "status": "pending"
    ]
    
    // 获取数据库引用
    let dbRef = Database.database().reference()
    
    // 生成唯一的订单键
    let newOrderKey = dbRef.child("customers").child(customerKey).child("orders").childByAutoId().key
    
    // 将订单数据写入对应的节点
    if let orderKey = newOrderKey {
        dbRef.child("customers").child(customerKey).child("orders").child(orderKey).setValue(orderData) { error, _ in
            if let error = error {
                print("保存订单失败:\(error.localizedDescription)")
            } else {
                print("订单创建成功!")
                // 这里可以添加跳转回客户页面的逻辑
                self.navigationController?.popViewController(animated: true)
            }
        }
    }
}

注意事项

  • 确保你的Customer类包含key属性,用来存储数据库中的客户子键;
  • 如果使用其他数据库(比如Core Data、Realm),调整对应的节点定位和数据写入逻辑即可;
  • 记得处理可能的错误情况,比如客户键为空、数据库写入失败等。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:05:51