【发布时间】:2021-08-23 00:08:33
【问题描述】:
在我的应用程序的设置 VC 中,我有一个带有 5 个不同自定义单元格的表格视图。我需要一些帮助的单元格设置了默认的开始和结束时间。这是使用带有日期/时间控件的弹出框/弹出窗口来完成的,该控件使用 segue 打开。此单元格包含 2 个按钮(开始和结束)和 2 个字段(开始和结束)。当点击其中一个按钮时,会显示相应的弹出框/弹出框。然后用户定义所需时间并点击完成按钮。我正在使用协议/委托方法从弹出框/弹出框传递时间字符串。这目前有效,但有一个例外。我希望新定义的时间填充单元格中相应的开始或结束字段。我的想法是将所有这些代码移动到自定义 tableViewCell 中,在那里我可以完全访问这些字段,但我似乎无法做到这一点。无法识别将 prepare(for segue: 移动到单元格文件。有没有办法从自定义单元格执行此 segue?或者有人对使用我当前的设置填充字段有想法吗?提前感谢您的帮助。
// All of this code is in the tableView controller except the last part where noted
override func prepare(for segue: UIStoryboardSegue, sender: Any?)
{
if segue.identifier == "quote_Presets_StartTime" // # 2
{
let storyboard : UIStoryboard = UIStoryboard(name: K.StoryboardID.date_Picker_SB, bundle: nil)
var popupVC : Date_Popup_VC = storyboard.instantiateViewController(withIdentifier: K.StoryboardID.date_Popup_VC) as! Date_Popup_VC
let navigationController = UINavigationController(rootViewController: popupVC)
let deviceName = UIDevice().type
let deviceString: String = ("\(deviceName)")
if deviceString.contains(K.theDevice.iPad)
{
popupVC = segue.destination as! Date_Popup_VC
if ModelData.isInline() // Wheel
{
popupVC.preferredContentSize = CGSize(width: 320, height: 300)
} else { // Inline
popupVC.preferredContentSize = CGSize(width: 350, height: 150)
}
navigationController.isNavigationBarHidden = true
} else if deviceString.contains(K.theDevice.iPhone) {
present(navigationController, animated: true, completion: nil)
navigationController.isNavigationBarHidden = false
}
popupVC.theBtn = 2
let formattedTime = ModelData.formattedTime_Read(time_Db: new_Start_Time)
popupVC.theDate = formattedTime
popupVC.timeStart_Delegate = self
} else if segue.identifier == "quote_Presets_EndTime" { // # 3
let storyboard : UIStoryboard = UIStoryboard(name: K.StoryboardID.date_Picker_SB, bundle: nil)
var popupVC : Date_Popup_VC = storyboard.instantiateViewController(withIdentifier: K.StoryboardID.date_Popup_VC) as! Date_Popup_VC
let navigationController = UINavigationController(rootViewController: popupVC)
let deviceName = UIDevice().type
let deviceString: String = ("\(deviceName)")
if deviceString.contains(K.theDevice.iPad)
{
popupVC = segue.destination as! Date_Popup_VC
if ModelData.isInline() // Wheel
{
popupVC.preferredContentSize = CGSize(width: 320, height: 300)
} else { // Inline
popupVC.preferredContentSize = CGSize(width: 350, height: 150)
}
navigationController.isNavigationBarHidden = true
} else if deviceString.contains(K.theDevice.iPhone) {
present(navigationController, animated: true, completion: nil)
navigationController.isNavigationBarHidden = false
}
popupVC.theBtn = 3
let formattedTime = ModelData.formattedTime_Read(time_Db: new_End_Time)
popupVC.theDate = formattedTime
popupVC.timeEnd_Delegate = self
}
}
// Executed from the cellForRowAt code
@objc
func setTheTimes(sender: UIButton)
{
switch sender.tag
{
case 0:
performSegue(withIdentifier: "quote_Presets_StartTime", sender: Any?.self)
case 1:
performSegue(withIdentifier: "quote_Presets_EndTime", sender: Any?.self)
default: break
}
}
extension Quote_Presets_VC: UITableViewDelegate, UITableViewDataSource
{
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
{
return 10
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
{
// cell_05 Time
let cell_05 = tableView.dequeueReusableCell(withIdentifier: K.ReuseIdentifier.defaultTime_Cell, for: indexPath) as! DefaultTime_Cell
cell_05.backgroundColor = Theme.current.darkAccentColor
cell_05.selectionStyle = .none
cell_05.delegate = self as SaveData_Time
cell_05.label_Outlet.labelTextColorOnly_Attributes(txt: K.Titles.defaultStartEnd, txtWgt: .regular)
cell_05.labelStart_Outlet.labelTextColorOnly_Attributes(txt: K.Titles.start, txtWgt: .regular)
cell_05.labelEnd_Outlet.labelTextColorOnly_Attributes(txt: K.Titles.end, txtWgt: .regular)
cell_05.startBtn_Outlet.addTarget(self, action: #selector(setTheTimes), for: .touchUpInside)
cell_05.endButton_Outlet.addTarget(self, action: #selector(setTheTimes), for: .touchUpInside)
cell_05.fldStart_Outlet.textField_Simple(text: ModelData.timeConversionTo_12(time24: new_Start_Time))
cell_05.fldEnd_Outlet.textField_Simple(text: ModelData.timeConversionTo_12(time24: new_End_Time))
switch indexPath.row
{
case 9: // Time
cell_05.fldStart_Outlet.tag = 0
cell_05.fldEnd_Outlet.tag = 1
cell_05.startBtn_Outlet.tag = 0
cell_05.endButton_Outlet.tag = 1
return cell_05
default: break
}
return UITableViewCell()
}
}
// These are the delegates for the protocol to pass the time string
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()
}
func clearTimeStart(value: String)
{
// startFld_Outlet.text = value
}
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()
}
func clearTimeEnd(value: String)
{
// endFld_Outlet.text = value
}
}
// The code below is the current tableview cell code
protocol SaveData_Time: AnyObject
{
func setSaveBtn_QuotePresets()
}
class DefaultTime_Cell: UITableViewCell
{
@IBOutlet weak var label_Outlet: UILabel!
@IBOutlet weak var labelStart_Outlet: UILabel!
@IBOutlet weak var fldStart_Outlet: UITextField!
@IBOutlet weak var fldEnd_Outlet: UITextField!
@IBOutlet weak var labelEnd_Outlet: UILabel!
@IBOutlet weak var startFldHgt_Constraint: NSLayoutConstraint!
@IBOutlet weak var startBtn_Outlet: UIButton!
@IBOutlet weak var endButton_Outlet: UIButton!
weak var delegate: SaveData_Time?
override func awakeFromNib()
{
super.awakeFromNib()
}
override func setSelected(_ selected: Bool, animated: Bool)
{
super.setSelected(selected, animated: animated)
}
@IBAction func startBtn_Tapped(_ sender: UIButton)
{
// This throws an error that cannot find performSegue in scope
//performSegue(withIdentifier: "quote_Presets_StartTime", sender: Any?.self)
}
@IBAction func endBtn_Tapped(_ sender: UIButton)
{
// This throws an error that cannot find performSegue in scope
//performSegue(withIdentifier: "quote_Presets_EndTime", sender: Any?.self)
}
}
【问题讨论】:
标签: ios swift xcode tableview uistoryboardsegue