События UITableView cellForRowAt indexPath на следующие 30 дней - PullRequest
0 голосов
/ 07 апреля 2020

У меня есть этот код ниже с ислами c даты (только месяц и день). То, что я пытаюсь сделать, это создать строку в моем табличном представлении для событий в следующие 30 дней. Я попробовал ниже, но это не работает. Я знаю, что я, очевидно, новичок и делаю что-то очень неправильно здесь, но я просто не уверен, как сделать это правильно тогда.

  var calendarDataSource = [
        "08/02": "SomeData",
        "08/03": "SomeData",
        "08/04": "SomeData",
        "08/05": "SomeData",
        "08/06": "SomeData",
        "08/07": "SomeData",
        "08/08": "SomeData",
        "08/09": "SomeData",
        "08/10": "SomeData",
        "08/11": "SomeData",
        "08/12": "SomeData",
        "08/13": "SomeData",
        "08/14": "SomeData",
        "08/15": "SomeData"
    ]





func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "calendarTVC") as! CalendarTableViewCell


    formatter.dateFormat = "yyyy MM dd"
    let islamicFormatter = DateFormatter()
    islamicFormatter.dateFormat = "MM/dd"
    islamicFormatter.calendar = Calendar(identifier: .islamic)

    let gregorianFormatter = DateFormatter()
    gregorianFormatter.calendar = Calendar(identifier: .gregorian)
    gregorianFormatter.dateStyle = .short
    gregorianFormatter.dateFormat = "yyyy MM dd"


    for index in 0...29 {
        let nextdate = Calendar.current.date(byAdding: .day, value: index, to: Date())
        let dayInt = Calendar.current.component(.day, from: nextdate!)
        let monthInt = Calendar.current.component(.month, from: nextdate!)
        let yearInt = Calendar.current.component(.year, from: nextdate!)
        print(date)
        let dateString = "\(yearInt) \(monthInt) \(dayInt)"

        if let date = gregorianFormatter.date(from: dateString) {
            let islamicString = islamicFormatter.string(from: date)

            if calendarDataSource[islamicString] == dateString {
                cell.TVDayLabel.text = Array(calendarDataSource.keys)[indexPath.row]
                cell.TVEventLabel.text = Array(calendarDataSource.values)[indexPath.row]

            } else {
                print("no event")
            }
        }
    }

        return cell
    }

Редактировать: Добавление результатов этого Ссылка на изображение

Ответы [ 2 ]

0 голосов
/ 07 апреля 2020

изменить

    formatter.dateFormat = "yyyy MM dd"

с

    formatter.dateFormat = "yyyy/MM/dd"

и

    gregorianFormatter.dateFormat = "yyyy MM dd"

с

    gregorianFormatter.dateFormat = "yyyy/MM/dd"
0 голосов
/ 07 апреля 2020

Я думаю, что проблема была в вашем ядре l oop. Исламская c строка имеет формат, подобный 08/12, но dateString имеет формат 2020 4 9. Они никогда не будут одинаковыми. Я думаю, что вы хотите рассчитать IslamicString для текущего дня, и просто посмотреть, есть ли у него какие-либо данные в вашем CalendarDataSource. Как это:

    if let date = gregorianFormatter.date(from: dateString) {
        let islamicString = islamicFormatter.string(from: date)

        if calendarDataSource[islamicString] != nil {
            cell.TVDayLabel.text = Array(calendarDataSource.keys)[indexPath.row]
            cell.TVEventLabel.text = Array(calendarDataSource.values)[indexPath.row]

        } else {
            print("no event")
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...