首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Swift_Why不显示节假日吗?

Swift_Why不显示节假日吗?
EN

Stack Overflow用户
提问于 2020-05-05 15:05:16
回答 1查看 199关注 0票数 1
代码语言:javascript
复制
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
    }

}
EN

回答 1

Stack Overflow用户

发布于 2020-05-05 17:21:05

在这两种方法中,

代码语言:javascript
复制
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的日期的字符串表示形式和由FSCalendar的数据源/委托方法提供的date参数。但是,您没有为格式化程序设置要使用的正确格式(或者根本没有设置任何格式)。这会导致formatter.string(from:)生成空字符串,因此您需要将空字符串与2020-12-25之类的实际日期进行比较。从您正在使用的API的API documentation看起来,日期似乎是以ISO8601本地日期格式出现的。

因此,您应该设置如下格式:

代码语言:javascript
复制
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

代码语言:javascript
复制
struct PublicHoliday {
    var name : String
    var date :  Date
}

并在获得响应时对其进行解析:

代码语言:javascript
复制
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.dateFSCalendar提供的日期进行比较。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61607565

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档