Swift-根据日期数组对不同数组进行排序

时间:2019-04-28 16:33:59

标签: ios swift

我有3个用户输入字段,每个字段创建一个不同的数组。这些数组用于填充UITableViewCell。我的意图是按日期对添加的单元格进行排序。

其中一个输入字段包含一个日期,该日期将用于对该表进行排序。为了同时显示日期,数组的类型为String,因此日期格式为String

假设我不会直接将其格式化为String并对其进行排序。有没有一种方法可以根据Date数组对其他数组进行排序?

import UIKit

class NotificationViewController: UIViewController {

    let defaults = UserDefaults.standard

    @IBOutlet weak var toolbar: UIToolbar!
    @IBOutlet weak var notificationView: UITableView!

    var isVisible = false

    var descArray: [String] = []
    var titleArray: [String] = []
    var dateArray: [String] = []
    var typeArray: [Int] = []

    override func viewDidLoad() {
        super.viewDidLoad()
        declareArrays()
        print(dateArray)
        self.toolbar.setBackgroundImage(UIImage(),
                                        forToolbarPosition: .any,
                                        barMetrics: .default)
        self.toolbar.setShadowImage(UIImage(), forToolbarPosition: .any)
        notificationView.delegate = self
        notificationView.dataSource = self
    }

    func declareArrays() {
        descArray = getDesc()
        titleArray = getTitle()
        dateArray = getDate()
        typeArray = getType()
    }

    func getDesc() -> [String] {
        return descNotificationArray
    }

    func getTitle() -> [String] {
        return titleNotificationArray
    }

    func getDate() -> [String] {
        return dateNotificationArray
    }

    func getType() -> [Int] {
        return notificationTypeArray
    }

    @IBAction func goBack(_ sender: Any) {
        performSegue(withIdentifier: "goBackToMain", sender: self)
    }

    @IBAction func addNotification(_ sender: Any) {
       performSegue(withIdentifier: "goToType", sender: self)
    }

}

extension NotificationViewController: UITableViewDataSource, UITableViewDelegate {

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return dateArray.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let date = dateArray[indexPath.row]
        let title = titleArray[indexPath.row]
        let desc = descArray[indexPath.row]
        let notType = typeArray[indexPath.row]

        if notType == 1 {
            let cell = tableView.dequeueReusableCell(withIdentifier: "TuvTableViewCell") as! TuvTableViewCell
            cell.setTitle(title: title)
            cell.setDesc(desc: desc)
            cell.setDate(date: date)
            return cell
        } else if notType == 2 {
            let cell = tableView.dequeueReusableCell(withIdentifier: "ServiceNotTableViewCell") as! ServiceNotTableViewCell
            cell.setTitle(title: title)
            cell.setDesc(desc: desc)
            cell.setDate(date: date)
            return cell
        } else {
            let cell = tableView.dequeueReusableCell(withIdentifier: "NotificationViewCell") as! NotificationViewCell
            cell.setTitle(title: title)
            cell.setDesc(desc: desc)
            cell.setDate(date: date)
            return cell
        }
    }

    func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {
        return true
    }

    func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
        if (editingStyle == .delete) {
            dateArray.remove(at: indexPath.item)
            titleArray.remove(at: indexPath.item)
            descArray.remove(at: indexPath.item)

            descNotificationArray.remove(at: indexPath.item)
            dateNotificationArray.remove(at: indexPath.item)
            titleNotificationArray.remove(at: indexPath.item)

            defaults.set(descNotificationArray, forKey: "descNotificationArray")
            defaults.set(dateNotificationArray, forKey: "dateNotificationArray")
            defaults.set(titleNotificationArray, forKey: "titleNotificationArray")

            tableView.deleteRows(at: [indexPath], with: .automatic)
        }
    }

}

编辑:

好吧,我添加了一个结构和一个func,它将输入添加到数组并对其进行排序:

struct not {
    var title: String
    var desc: String
    var Date: Date
}

func appendToStructArray() {
        let notificationData: not = not(title: notifTitle.text!, desc: notifDescribtion.text!, Date: datePicker.date)
        notStructArray.append(notificationData)
        notStructArray.sort(by: { $0.Date < $1.Date })
    }

现在在TableViewController中:我如何设法从数组内部的一个结构获取数据并将其添加到单元格中,就像我之前对数组所做的一样?

2 个答案:

答案 0 :(得分:3)

正确的解决方案是使用一个数组,而不是四个。创建具有4个属性的struct。然后拥有该结构的一个数组。然后,根据需要添加,删除,排序和过滤数组以填充表视图就变得很简单。

答案 1 :(得分:2)

代替使用所有这些数组,您可以考虑使用包含所有这些数组的另一种类型,例如:

struct Foo {
  let date: Date
  let desc: String
  let type: String
  let title: String
}

然后,您将有一个foos数组,可以按日期排序。这样一来,无需处理不同的数组即可对所有内容进行排序。