Swift_Почему не отображаются праздники? - PullRequest
1 голос
/ 05 мая 2020
import FSCalendar
import SwiftyJSON
import Alamofire
//import CalendarKit
import UIKit

struct PublicHoliday {

    var name : String
    var date :  String
}
class ViewController: UIViewController, FSCalendarDelegate, FSCalendarDataSource {
    @IBOutlet var calendar: FSCalendar!
    @IBOutlet var contentsLabel: UILabel!
    let formatter= DateFormatter()
    var PH : [PublicHoliday]=[]

    override func viewDidLoad() {
        super.viewDidLoad()
       calendarApi(year:"2020")

        calendar.appearance.titleWeekendColor = UIColor.orange
        calendar.allowsMultipleSelection = true
        calendar.clipsToBounds = true
        calendar.delegate = self
        calendar.dataSource = self

    }
    func calendarApi(year:String){
        let baseURLStr = "https://calendarific.com/api/v2/holidays"
        let apiKey = "-------------------"
        let urlStr = ["api_key":apiKey,"country":"KR","year":year]
        //let urlStr = url + "api_key" +apiKey +"&country=KR"+"&year="+year


        Alamofire.request(baseURLStr, method: .get, parameters: urlStr, encoding: URLEncoding.default).validate(statusCode:200..<300).responseJSON{

            (response) in
            switch response.result{
            case .success(let value):
                let jsonObject = JSON(value)
                let count = jsonObject["response"]["PH"].count
                for i in 0..<count {
                    let name = jsonObject["response"]["PH"][i]["name"].string!
                    let date = jsonObject["response"]["PH"][i]["date"]["iso"].string!
                    let ph = PublicHoliday(name: name, date: date)
                    self.PH.append(ph)
                    self.calendar.reloadData()

                }

            case .failure(_):
                print("error")

            }

        }

    }

    func calendar(_ calendar: FSCalendar, didSelect date: Date, at monthPosition: FSCalendarMonthPosition) {

        formatter.dateFormat = "EEEE MM-dd-YYYY"
        let string = formatter.string(from: date)
        print("\(string)")

    }



    func calendar(_ calendar:FSCalendar, appearance:FSCalendarAppearance, fillDefaultColorFor date: Date)->UIColor?{

        let dataForm = formatter.string(from:date)
        for ph in self.PH{
            if ph.date.compare(dataForm) == ComparisonResult.orderedSame{
                return UIColor.cyan
           }
        }
        return nil
    }
    func calendar(_ calendar: FSCalendar, subtitleFor date: Date) -> String? {
        let dataForm = formatter.string(from: date)
        for ph in self.PH{
            if ph.date.compare(dataForm) == ComparisonResult.orderedSame{
                return ph.name
            }
        }
        return nil
    }

}

1 Ответ

1 голос
/ 05 мая 2020

В этих двух методах

func calendar(_ calendar:FSCalendar, appearance:FSCalendarAppearance, fillDefaultColorFor date: Date)->UIColor?{

    let dataForm = formatter.string(from:date)
    for ph in self.PH{
        if ph.date.compare(dataForm) == ComparisonResult.orderedSame{
            return UIColor.cyan
       }
    }
    return nil
}
func calendar(_ calendar: FSCalendar, subtitleFor date: Date) -> String? {
    let dataForm = formatter.string(from: date)
    for ph in self.PH{
        if ph.date.compare(dataForm) == ComparisonResult.orderedSame{
            return ph.name
        }
    }
    return nil
}

Вы сравниваете строковые представления дат из источника данных PH и параметра date, предоставленного методом источника данных / делегата FSCalendar . Однако вы не установили правильный формат (или вообще любой формат) для использования форматером. Это приводит к тому, что formatter.string(from:) создает пустые строки, поэтому вы сравниваете пустые строки с фактическими датами, такими как 2020-12-25. Из краткого обзора документации API API, который вы используете, кажется, что даты указаны в локальном формате даты ISO 8601.

Поэтому вам следует установить такой формат:

func calendar(_ calendar:FSCalendar, appearance:FSCalendarAppearance, fillDefaultColorFor date: Date)->UIColor?{
    formatter.dateFormat = "yyyy-MM-dd"
    let dataForm = formatter.string(from:date)
    for ph in self.PH{
        if ph.date == dataFrom {
            return UIColor.cyan
       }
    }
    return nil
}
func calendar(_ calendar: FSCalendar, subtitleFor date: Date) -> String? {
    formatter.dateFormat = "yyyy-MM-dd"
    let dataForm = formatter.string(from: date)
    for ph in self.PH{
        if ph.date == dataFrom {
            return ph.name
        }
    }
    return nil
}

Еще лучше было бы использовать Date напрямую в источнике данных:

struct PublicHoliday {
    var name : String
    var date :  Date
}

И проанализируйте его, когда получите ответ:

let dateString = jsonObject["response"]["PH"][i]["date"]["iso"].string!
formatter.dateFormat = "yyyy-MM-dd"
let date = formatter.date(from: dateString)!
let ph = PublicHoliday(name: name, date: date)

Таким образом, вы можете сравнить ph.date напрямую с датой, предоставленной FSCalendar.

...