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
}
}
最佳答案
在这两种方法中
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
的datasource / delegate方法提供的FSCalendar
参数中日期的字符串表示形式。但是,您没有为格式化程序设置正确的格式(或实际上没有任何格式)。这会导致formatter.string(from:)
产生空字符串,因此您正在将空字符串与实际日期(例如2020-12-25
)进行比较。从所使用的API的API documentation的简短外观看,日期似乎采用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
提供的日期进行比较。
关于ios - Swift_为什么不显示假期?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61607565/