ios - Swift_为什么不显示假期?

标签 ios swift xcode calendar cocoapods

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
}

您正在比较数据源PHdate的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.dateFSCalendar提供的日期进行比较。

关于ios - Swift_为什么不显示假期?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61607565/

相关文章:

ios - 我的应用在ios 7中显示黑色状态栏,但我想要默认的白色iOS 7样式

ios - 通过来自 UITextField 的 Int 可选变量收到 "fatal error: unexpectedly found nil while unwrapping an Optional value"

swift - 访问父属性

ios - 文件中的 Xcode 8 断点不起作用

ios - 在类中设置和删除布局

ios - 先缓冲数据再加载-iOS

ios - 大写字符在Iphone中转换为区分大小写

Objective-c 如何从终端应用程序制作 GUI 窗口

ios - 无需滚动 Swift 即可动态更新单元格高度

ios - 如何在 swift 4 中将文本字段条目限制为小数点后两位?