有一个tableView,它最初应该是空的。用户可以添加事件点击“+”按钮并在单独的视图控制器上填写表单(AddSession文件)。表单包含事件开始和结束时间的文本字段,以及事件的名称和地点。只要用户点击此表单中的添加按钮我希望tableView中的事件自动按时间排列。较晚的事件应该排在底部,较早的事件应该排在顶部。看起来有点复杂,而且我对编码非常陌生。每个事件都有开始时间和结束时间,所以我甚至不能开始思考在排序过程中应该比较什么。我假设两个单独的事件不应该有时间重叠,我可能也应该考虑如何限制这一点。否则,整个tableView将变得完全混乱。那么我如何才能完成这个自动排列/排序过程呢?
下面是我的主viewController的代码:
import UIKit
class ParticularEventVC: UIViewController, UITableViewDataSource {
@IBOutlet weak var sessionsTable: UITableView!
var sessions: [sessionModel] = []
override func viewDidLoad() {
super.viewDidLoad()
sessionsTable.dataSource = self
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
sessions.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = sessionsTable.dequeueReusableCell(withIdentifier: "PrototypeCell", for: indexPath as IndexPath) as! PrototypeCell
let session = sessions[indexPath.row]
cell.sessionBeginningTime.text = session.modelTimeBeginning
cell.sessionEndingTime.text = session.modelTimeEnding
cell.sessionName.text = session.modelSession
cell.sessionVenue.text = session.modelVenue
return cell
}
@IBAction func unwindToSessionsList(segue: UIStoryboardSegue) {
guard let vc = segue.source as? AddSession else {return}
guard let timeBeginning = vc.timeBeginningTextField.text, let timeEnding = vc.timeEndingTextField.text, let ssn = vc.sessionNameTextField.text, let vn = vc.sessionVenueTextField.text else {return}
let Session = sessionModel(modelTimeBeginning: timeBeginning, modelTimeEnding: timeEnding, modelSession: ssn, modelVenue: vn)
sessions.append(Session)
sessionsTable.reloadData()
}
}
下面是添加会话的代码:
import UIKit
class AddSession: UIViewController {
@IBOutlet weak var timeBeginningTextField: UITextField!
@IBOutlet weak var timeEndingTextField: UITextField!
@IBOutlet weak var sessionNameTextField: UITextField!
@IBOutlet weak var sessionVenueTextField: UITextField!
@IBAction func cancelAddSession(_ sender: Any) {
performSegue(withIdentifier: "unwindToSessionsList", sender: self)}
@IBAction func addSession(_ sender: Any) {
performSegue(withIdentifier: "unwindToSessionsList", sender: self)}
override func viewDidLoad() {
super.viewDidLoad()
// MARK: Filling the beginning time with the datepicker
let timeB = Date()
let formatterTB = DateFormatter()
formatterTB.dateFormat = "HH:mm"
timeBeginningTextField.text = formatterTB.string(from: timeB)
let timePickerB = UIDatePicker()
timePickerB.datePickerMode = .time
timePickerB.addTarget(self, action: #selector(timePickerBValueChanged(sender:)), for: UIControl.Event.valueChanged)
timePickerB.preferredDatePickerStyle = .wheels
timePickerB.frame.size = CGSize(width: 0, height: 250)
timeBeginningTextField.inputView = timePickerB
// MARK: Filling the ending time with the datepicker
let timeE = Date()
let formatterTE = DateFormatter()
formatterTE.dateFormat = "HH:mm"
timeEndingTextField.text = formatterTE.string(from: timeE)
let timePickerE = UIDatePicker()
timePickerE.datePickerMode = .time
timePickerE.addTarget(self, action: #selector(timePickerEValueChanged(sender:)), for: UIControl.Event.valueChanged)
timePickerE.preferredDatePickerStyle = .wheels
timePickerE.frame.size = CGSize(width: 0, height: 250)
timeEndingTextField.inputView = timePickerE
}
@objc func timePickerBValueChanged(sender: UIDatePicker) {
let FormatterTB = DateFormatter()
FormatterTB.dateFormat = "HH:mm"
timeBeginningTextField.text = FormatterTB.string(from: sender.date)}
@objc func timePickerEValueChanged(sender: UIDatePicker) {
let formatterTE = DateFormatter()
formatterTE.dateFormat = "HH:mm"
timeEndingTextField.text = formatterTE.string(from: sender.date)}
}
这是我的原型单元的代码(不知道你是否需要它):
import UIKit
class PrototypeCell: UITableViewCell {
@IBOutlet weak var sessionBeginningTime: UILabel!
@IBOutlet weak var sessionEndingTime: UILabel!
@IBOutlet weak var sessionName: UILabel!
@IBOutlet weak var sessionVenue: UILabel!
override func awakeFromNib() {
super.awakeFromNib()}
override func setSelected(_ selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)}
}
这是我的session模型的代码:
import Foundation
struct sessionModel {
let modelTimeBeginning: String
let modelTimeEnding: String
let modelSession: String
let modelVenue: String
}
[一个月一次](一个月一次)
另外,回应你的答案(NeZha和OneComment家伙)(不知道该放在哪里):
非常感谢您的回应和解决方案!正如我之前所说,我对编码非常陌生,所以我对您提供的内容没有这种直观的理解,lol。我主要看YouTube教程并尝试使用他们的方法来实现我的目的。至于你所说的,我给了它一个旋转并改变了:
let modelTimeBeginning: String
let modelTimeEnding: String
到
let modelTimeBeginning: Date
let modelTimeEnding: Date
但它引起了一大堆新问题。
例如:
let session = sessions[indexPath.row]
cell.beginningTime.date = session.modelTimeBeginning
cell.endingTime.date = session.modelTimeEnding
return cell
它表示“类型”UILabel“的值没有成员”date““
这里:
guard let vc = segue.source as? AddSession else {return}
guard let timeBeginning = vc.beginningTimeDatePicker.date, let timeEnding = vc.endingTimeDatePicker.date, let ssn = vc.eventTextField.text else {return}
let Session = Model(modelTimeBeginning: timeBeginning, modelTimeEnding: timeEnding, modelSession: ssn)
sessions.append(Session)
sessionsTable.reloadData()
条件绑定的初始化器必须具有Optional类型,而不是'Date'
据我所知,我正在将Date转换为String,以便填充文本字段。所以在我进行转换之前,应该在某个地方进行排序,对吗?天哪,这些编码太令人困惑了。
1条答案
按热度按时间qcuzuvrc1#
如前所述,在会话结构中使用date作为Date类型。