Ios Swift 3中的JTAppleCalendar单元格背景颜色更改错误

Ios Swift 3中的JTAppleCalendar单元格背景颜色更改错误,ios,swift3,calendar,jtapplecalendar,Ios,Swift3,Calendar,Jtapplecalendar,我在我的项目中使用JTAppleCalendar,你可以在这里看到它->。但当我想改变某些单元格的背景色时,会给我带来一个大问题,当我过去几个月和下个月某些单元格的背景色发生变化时 这怎么可能?我怎样才能修好它?我只想改变;榜样 let fetchRequest=NSFetchRequest(entityName:“Mains”) let predicate=NSPredicate(格式:“日期=%@”,freshdate) fetchRequest.predicate=谓词 如果让结果=尝试?

我在我的项目中使用
JTAppleCalendar
,你可以在这里看到它->。但当我想改变某些单元格的背景色时,会给我带来一个大问题,当我过去几个月和下个月某些单元格的背景色发生变化时

这怎么可能?我怎样才能修好它?我只想改变;榜样

let fetchRequest=NSFetchRequest(entityName:“Mains”)
let predicate=NSPredicate(格式:“日期=%@”,freshdate)
fetchRequest.predicate=谓词
如果让结果=尝试?context.fetch(fetchRequest)as![电源]{
对于结果中的对象{
如果(object.user!==“”
一个,但当我再过一个月,在日历中,一些单元格的背景发生了变化

下面的图片显示了应用程序打开时的真实情况

但当我上个月或下个月改变了下面的一些单元格背景。这是一个错误。我不想改变这一点

下面是我的代码,哪里会出错

@IBOutlet weak var calendarView: JTAppleCalendarView!
let kStartDate = "2016-01-01"
let kEndDate = "2049-12-31"
var numberOfRows = 6
let formatter = DateFormatter()
var myCalendar = Calendar(identifier: .gregorian)
var generateInDates: InDateCellGeneration = .forAllMonths
var generateOutDates: OutDateCellGeneration = .off
var hasStrictBoundaries = true
let firstDayOfWeek: DaysOfWeek = .monday
var monthSize: MonthSize? = nil

extension ViewController: JTAppleCalendarViewDelegate, JTAppleCalendarViewDataSource {
   func configureCalendar(_ calendar: JTAppleCalendarView) -> ConfigurationParameters {
      formatter.dateFormat = "yyyy-MM-dd"
      formatter.timeZone = TimeZone(secondsFromGMT: 0)
      formatter.locale = Locale(identifier: "en_US")

      let startDate = formatter.date(from: kStartDate)!
      let endDate = formatter.date(from: kEndDate)!      
      let parameters = ConfigurationParameters(startDate: startDate,
                                                     endDate: endDate,
                                                     numberOfRows: numberOfRows,
                                                     calendar: myCalendar,
                                                     generateInDates: generateInDates,
                                                     generateOutDates: generateOutDates,
                                                     firstDayOfWeek: firstDayOfWeek,
                                                     hasStrictBoundaries: hasStrictBoundaries)
      return parameters
   }

   func calendar(_ calendar: JTAppleCalendarView, cellForItemAt date: Date, cellState: CellState, indexPath: IndexPath) -> JTAppleCell {
        let cell = calendar.dequeueReusableCell(withReuseIdentifier: "CellView", for: indexPath) as! CellView
        let comedate = String(describing: myCalendar.date(byAdding: .day, value: 1, to: cellState.date))
        var freshdate = comedate.substring(from: 9)
        freshdate = freshdate.substring(to: 10)

        let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName:"Mains")
        let predicate = NSPredicate (format:"date = %@",freshdate)
        fetchRequest.predicate = predicate

        if let result = try? context.fetch(fetchRequest) as! [Mains] {
            for object in result {
                if(object.user! == "" < freshdate) {
                   cell.contentView.backgroundColor = hexStringToUIColor(hex:  "f7bca6")
                } else if(object.userme! == "") {
                   cell.contentView.backgroundColor = hexStringToUIColor(hex:  "f7bca6")
                } else {
                   cell.contentView.backgroundColor = hexStringToUIColor(hex:  "ffffff")
                }
            }
        }

        handleCellConfiguration(cell: cell, cellState: cellState)
        return cell
   }
}
@ibvar日历视图:JTAppleCalendarView!
让kStartDate=“2016-01-01”
让kEndDate=“2049-12-31”
var numberOfRows=6
let formatter=DateFormatter()
var myCalendar=日历(标识符:。公历)
var generateInDates:InDateCellGeneration=.forAllMonths
var generateOutDates:OutDateCellGeneration=.off
var hasStrictBoundaries=true
让firstDayOfWeek:DaysOfWeek=.monday
var monthSize:monthSize?=无
扩展视图控制器:JTAppleCalendarViewDelegate,JTAppleCalendarViewDataSource{
func configureCalendar(uCalendar:JTAppleCalendarView)->ConfigurationParameters{
formatter.dateFormat=“yyyy-MM-dd”
formatter.timeZone=时区(秒自GMT:0)
formatter.locale=locale(标识符:“en_US”)
让startDate=formatter.date(from:kStartDate)!
让endDate=formatter.date(from:kEndDate)!
让参数=配置参数(起始日期:起始日期,
endDate:endDate,
numberOfRows:numberOfRows,
日历:我的日历,
generateInDates:generateInDates,
生成日期:生成日期,
星期一:星期一,
hasStrictBoundaries:hasStrictBoundaries)
返回参数
}
func日历(日历:JTAppleCalendarView,cellForItemAt日期:日期,cellState:cellState,indexPath:indexPath)->JTAppleCell{
让cell=calendar.dequeueReusableCell(带有reuseidentifier:“CellView”,for:indexPath)作为!CellView
let cometate=String(描述:myCalendar.date(通过添加:.day,值:1,到:cellState.date))
var freshdate=cometate.substring(from:9)
freshdate=freshdate.substring(to:10)
let fetchRequest=NSFetchRequest(entityName:“Mains”)
let predicate=NSPredicate(格式:“日期=%@”,freshdate)
fetchRequest.predicate=谓词
如果let result=try?context.fetch(fetchRequest)as![Mains]{
对于结果中的对象{
如果(object.user!==“”
我认为这是重用单元格的问题,您可以尝试设置默认背景色

if freshdate == "2017-04-16" {
   cell.contentView.backgroundColor = hexStringToUIColor(hex:  "f7bca6")
} else if freshdate == "2017-04-28" {
   cell.contentView.backgroundColor = hexStringToUIColor(hex:  "45ca6")
} else {
   cell.contentView.backgroundColor = hexStringToUIColor(hex:  "your_color")
}

我认为这是重用单元格的问题,您可以尝试设置默认背景色

if freshdate == "2017-04-16" {
   cell.contentView.backgroundColor = hexStringToUIColor(hex:  "f7bca6")
} else if freshdate == "2017-04-28" {
   cell.contentView.backgroundColor = hexStringToUIColor(hex:  "45ca6")
} else {
   cell.contentView.backgroundColor = hexStringToUIColor(hex:  "your_color")
}
如前所述,这是一个单元重用问题。但这里还有另一个问题

屏幕上的每个单元格都会调用此函数。简而言之,这就是正在发生的问题

func calendar(_ calendar: JTAppleCalendarView, cellForItemAt date: Date, cellState: CellState, indexPath: IndexPath) -> JTAppleCell {

    // Here you got one single cell
    let cell = calendar.dequeueReusableCell(withReuseIdentifier: "CellView", for: indexPath) as! CellView

    // Here you got a result for your single cell
    if let result = try? context.fetch(fetchRequest) as! [Mains] {

         // Here you are changing the color of a *single* cell multiple times
         // Based on the number of [objects] found in the [result]
         // Why?
         for object in result {
            if(object.user! == "" < freshdate) {
               cell.contentView.backgroundColor = hexStringToUIColor(hex:  "f7bca6")
            } else if(object.userme! == "") {
               cell.contentView.backgroundColor = hexStringToUIColor(hex:  "f7bca6")
            } else {
               cell.contentView.backgroundColor = hexStringToUIColor(hex:  "ffffff")
            }
        }
    } else { 
         // There will also be a problem here if you data is not found.
         // Your cell background color will just pick up any random re-used color
    }
}
现在,根据数据源中的值,是否要更改单元格的背景色? 看起来您正在检查
对象.user
对象.userme
空值

看起来您正在检查任意数据

函数将单元格映射到日期,而不是任意数据。 因此,必须将数据源映射到日期。这可以通过
词典
完成。因此,将数据源更改为如下所示:

let myDataSource: [String: Mains ] = [:]
// The String can be a date string
// The Mains object can be the object associated with that Date
func calendar(_ calendar: JTAppleCalendarView, cellForItemAt date: Date, cellState: CellState, indexPath: IndexPath) -> JTAppleCell {

    // Here you got one single cell
    let cell = calendar.dequeueReusableCell(withReuseIdentifier: "CellView", for: indexPath) as! CellView

    // Here you got a result for your single cell
    let dateString = dateFormatter.stringFrom(date)
    let myObjectForThisCell = myDataSource[dateString]

    if(myObjectForThisCell.user! == "" < freshdate) {
       cell.contentView.backgroundColor = hexStringToUIColor(hex:  "f7bca6")
    } else if(myObjectForThisCell.userme! == "") {
       cell.contentView.backgroundColor = hexStringToUIColor(hex:  "f7bca6")
    } else {
       cell.contentView.backgroundColor = hexStringToUIColor(hex:  "ffffff")
    }
}
现在,您的
cellForItem
函数可以如下所示:

let myDataSource: [String: Mains ] = [:]
// The String can be a date string
// The Mains object can be the object associated with that Date
func calendar(_ calendar: JTAppleCalendarView, cellForItemAt date: Date, cellState: CellState, indexPath: IndexPath) -> JTAppleCell {

    // Here you got one single cell
    let cell = calendar.dequeueReusableCell(withReuseIdentifier: "CellView", for: indexPath) as! CellView

    // Here you got a result for your single cell
    let dateString = dateFormatter.stringFrom(date)
    let myObjectForThisCell = myDataSource[dateString]

    if(myObjectForThisCell.user! == "" < freshdate) {
       cell.contentView.backgroundColor = hexStringToUIColor(hex:  "f7bca6")
    } else if(myObjectForThisCell.userme! == "") {
       cell.contentView.backgroundColor = hexStringToUIColor(hex:  "f7bca6")
    } else {
       cell.contentView.backgroundColor = hexStringToUIColor(hex:  "ffffff")
    }
}
func日历(calendar:JTAppleCalendarView,cellForItemAt日期:日期,cellState:cellState,indexPath:indexPath)->JTAppleCell{
//这里有一个单间
让cell=calendar.dequeueReusableCell(带有reuseidentifier:“CellView”,for:indexPath)作为!CellView
//这是您的单个单元格的结果
让dateString=dateFormatter.stringFrom(日期)
让myObjectForThisCell=myDataSource[dateString]
if(myObjectForThisCell.user!==“”
我贴在abov上的代码
 if let result = try? context.fetch(fetchRequest) as! [Mains] {
            for object in result {
                if(object.user! == "" < freshdate) {
                   cell.contentView.backgroundColor = hexStringToUIColor(hex:  "f7bca6")
                } else if(object.userme! == "") {
                   cell.contentView.backgroundColor = hexStringToUIColor(hex:  "f7bca6")
                } else {
                   cell.contentView.backgroundColor = hexStringToUIColor(hex:  "ffffff")
                }
            }
        }