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
相关产品推荐
相关产品推荐

