iOS Swift 如何将弹窗返回的时间填充到自定义UITableViewCell对应输入框
问题解答
自定义Cell无法调用performSegue的原因
不能从UITableViewCell子类中直接执行segue。performSegue(withIdentifier:sender:)是UIViewController的专属方法,Cell作为视图层组件不持有VC的segue上下文,也没有该方法的实现,所以调用必然报错。
你当前通过cellForRowAt给Cell按钮绑定VC中setTheTimes方法触发segue的实现逻辑是合理的,不需要把跳转逻辑移到Cell内。
选中时间自动填充输入框的实现方案
你已经通过代理拿到了弹窗返回的时间,并且将新值赋值给了new_Start_Time/new_End_Time变量,输入框没有更新是因为变量更新后没有同步刷新Cell视图,基于现有代码结构有两种可选方案:
方案1:刷新对应Cell(改动最小)
你的时间设置Cell固定在第9行(section为0),只需要在时间回调代理方法末尾刷新该行即可,cellForRowAt的原有逻辑会自动读取最新时间填充到输入框:
extension Quote_Presets_VC: TimeStart_DatePopupDelegate, TimeEnd_DatePopupDelegate { func saveTimeStart(value: String) { // 原有逻辑保持不变 var originalValue: String = "" for theValue in presetsArray { originalValue = theValue.start_Time } let formattedValue = ModelData.timeConversionTo_24(time12: value) if formattedValue != originalValue { new_Start_Time = value save_Array_Quote[6] = K.AppFacing_Titles.true_ } else { save_Array_Quote[6] = K.AppFacing_Titles.false_ } setSaveBtn_QuotePresets() // 新增:刷新时间行Cell tableView.reloadRows(at: [IndexPath(row: 9, section: 0)], with: .none) } func saveTimeEnd(value: String) { // 原有逻辑保持不变 var originalValue: String = "" for theValue in presetsArray { originalValue = theValue.end_Time } let formattedValue = ModelData.timeConversionTo_24(time12: value) if formattedValue != originalValue { new_End_Time = value save_Array_Quote[7] = K.AppFacing_Titles.true_ } else { save_Array_Quote[7] = K.AppFacing_Titles.false_ } setSaveBtn_QuotePresets() // 新增:刷新时间行Cell tableView.reloadRows(at: [IndexPath(row: 9, section: 0)], with: .none) } }
方案2:直接更新输入框(性能更优,无刷新闪动感)
不想触发Cell整体刷新的话,可以直接拿到当前显示的时间Cell,单独修改输入框内容:
// saveTimeStart方法末尾新增 if let timeCell = tableView.cellForRow(at: IndexPath(row: 9, section: 0)) as? DefaultTime_Cell { timeCell.fldStart_Outlet.text = ModelData.timeConversionTo_12(time24: new_Start_Time) } // saveTimeEnd方法末尾新增 if let timeCell = tableView.cellForRow(at: IndexPath(row: 9, section: 0)) as? DefaultTime_Cell { timeCell.fldEnd_Outlet.text = ModelData.timeConversionTo_12(time24: new_End_Time) }
可选优化:将Cell按钮交互内聚
如果后续想把Cell的交互逻辑封装到Cell内部,可通过新增代理的方式实现,无需在cellForRowAt中单独绑定Target:
// 1. 扩展Cell协议 protocol DefaultTimeCellDelegate: AnyObject { func didTapStartTimeBtn() func didTapEndTimeBtn() } // 2. Cell内声明代理并触发回调 class DefaultTime_Cell: UITableViewCell { weak var actionDelegate: DefaultTimeCellDelegate? @IBAction func startBtn_Tapped(_ sender: UIButton) { actionDelegate?.didTapStartTimeBtn() } @IBAction func endBtn_Tapped(_ sender: UIButton) { actionDelegate?.didTapEndTimeBtn() } } // 3. VC遵循协议,在cellForRowAt中赋值代理 extension Quote_Presets_VC: DefaultTimeCellDelegate { func didTapStartTimeBtn() { performSegue(withIdentifier: "quote_Presets_StartTime", sender: nil) } func didTapEndTimeBtn() { performSegue(withIdentifier: "quote_Presets_EndTime", sender: nil) } }
内容的提问来源于stack exchange,提问作者user11004336
相关产品推荐
相关产品推荐

