xcode 按单元格中指定的时间(HH:mm)排列tableView中的单元格

9rbhqvlz  于 2023-03-24  发布在  其他
关注(0)|答案(1)|浏览(89)

有一个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,以便填充文本字段。所以在我进行转换之前,应该在某个地方进行排序,对吗?天哪,这些编码太令人困惑了。

qcuzuvrc

qcuzuvrc1#

如前所述,在会话结构中使用date作为Date类型。

sessions.append(Session)
sessions.sort { $0.date < $1.date } //Add this line,
sessionsTable.reloadData()

相关问题