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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 20:45:04