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

Swift中如何获取.xib自定义单元格内UIPickerView的选中值

获取UITableView单元格中UIPickerView的选中值解决方案

针对你作为Swift新手遇到的问题,我们通过数据绑定+回调闭包的方式实现获取每个单元格PickerView的选中值,以下是分步修改方案:


步骤1:更新Menu结构体,添加选中值存储属性

给Menu新增一个属性,专门保存对应单元格PickerView的选中值,后续所有操作都基于这个数据源同步。

import UIKit

struct Menu{
    var nameMenu : String
    var priceMenu : Int
    var pickerData : [String] // 修正拼写为规范的pickerData
    var selectedQuantity: String = "0" // 新增:存储当前选中的数量,默认值0
}

同时更新MenuWeekViewController里的初始化数组,把pickerDada改成pickerData:

var menus : [Menu] = [
    Menu(nameMenu: "BBQ", priceMenu: 8, pickerData: ["0","1","2","3","4","5","6","7","8","9","10"]),
    Menu(nameMenu: "BBQ2", priceMenu: 8, pickerData: ["0","1","2","3","4","5","6","7","8","9","10"]),
    Menu(nameMenu: "BBQ3", priceMenu: 8, pickerData: ["0","1","2","3","4","5","6","7","8","9","10"]),
    Menu(nameMenu: "BBQ4", priceMenu: 8, pickerData: ["0","1","2","3","4","5","6","7","8","9","10"]),
    Menu(nameMenu: "BBQ4", priceMenu: 8, pickerData: ["0","1","2","3","4","5","6","7","8","9","10"]),
    Menu(nameMenu: "BBQ4", priceMenu: 8, pickerData: ["0","1","2","3","4","5","6","7","8","9","10"]),
]

步骤2:修改FoodTableViewCell,添加回调闭包关联外部数据

让Cell不再硬编码Picker数据,而是接收外部传入的pickerData,同时通过闭包把选中值传递给ViewController:

import UIKit

class FoodTableViewCell: UITableViewCell,UIPickerViewDelegate, UIPickerViewDataSource  {
   
    // 接收外部传入的Picker选项数据,更新时自动刷新Picker
    var pickerData: [String] = [] {
        didSet {
            quantityMenu.reloadAllComponents()
        }
    }
    // 新增:回调闭包,选中Picker时通知外部更新数据
    var onQuantitySelected: ((String) -> Void)?
    
    @IBOutlet weak var quantityMenu: UIPickerView!
    @IBOutlet weak var priceMenu: UILabel!
    @IBOutlet weak var menuName: UILabel!
    
    override func awakeFromNib() {
        super.awakeFromNib()
        quantityMenu.dataSource = self
        quantityMenu.delegate = self
        quantityMenu.setValue(UIColor.white, forKey: "textColor")
    }

    override func setSelected(_ selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)
    }
    
    func numberOfComponents(in pickerView: UIPickerView) -> Int {
        return 1
    }
    
    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        return pickerData.count // 不再固定11,改用传入的数据长度
    }
    
    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
          return pickerData[row]
      }
    
    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int)
       {
           let selectedValue = pickerData[row]
           print(selectedValue)
           // 调用闭包,把选中值传递给ViewController
           onQuantitySelected?(selectedValue)
        }
    
    // 新增:设置Picker默认选中行,与Menu的选中值同步
    func setSelectedQuantity(_ quantity: String) {
        if let index = pickerData.firstIndex(of: quantity) {
            quantityMenu.selectRow(index, inComponent: 0, animated: false)
        }
    }
}

步骤3:在MenuWeekViewController中绑定Cell与Menu数据

在创建Cell时,将对应Menu的数据传递给Cell,并绑定回调闭包更新Menu的选中值:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "ReusableMenuCell", for: indexPath) as! FoodTableViewCell
    let currentMenu = menus[indexPath.row]
    
    cell.menuName?.text = currentMenu.nameMenu
    cell.priceMenu?.text = "\(currentMenu.priceMenu) CHF"
    // 传递Picker数据给Cell
    cell.pickerData = currentMenu.pickerData
    // 设置Picker默认选中值
    cell.setSelectedQuantity(currentMenu.selectedQuantity)
    // 绑定回调,更新Menu的选中值
    cell.onQuantitySelected = { [weak self] selectedValue in
        guard let self = self else { return }
        self.menus[indexPath.row].selectedQuantity = selectedValue
    }
    
    return cell
}

步骤4:获取所有单元格的选中值

在需要使用选中值的地方(比如sendOrder按钮点击事件),直接遍历menus数组即可拿到每个Menu的选中数量:

@IBAction func sendOrder(_ sender: UIButton) {
    // 遍历所有Menu,输出名称和对应选中数量
    for menu in menus {
        print("\(menu.nameMenu) 选中数量:\(menu.selectedQuantity)")
    }
    // 此处可将选中值发送到服务器或做其他业务处理
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 03:35:23