FSCalendar numberOfItems用于使用Realm进行日期过滤

问题描述

这困扰了我很久了。我最初是在一个月前问这个问题,但仍然无法正常工作:

How do I show 2 different color dots for a date using FSCalendar?

我想证明:

  1. 在有收入交易的日期有一个绿点。
  2. 一个红点代表发生费用交易的日期。
  3. 在有收入交易和费用交易的日期有两个点,一个绿色和一个红色。

我的交易数据模型如下:

import Foundation
import RealmSwift

class Transaction: Object {
    
    @objc dynamic var transactionDescription: String? = nil
    @objc dynamic var transactionAmount = 0.0
    @objc dynamic var transactionDate = Date()
    @objc dynamic var transactionCategory: Category? = nil
    @objc dynamic var repeatInterval = ""
    @objc dynamic var isCleared = false
    @objc dynamic var transactionID = UUID().uuidString
    
    convenience init(theDate: Date) {
        self.init()
        self.transactionDate = theDate
    }
    
    override static func primaryKey() -> String? {
        return "transactionID"
    }
        
}

我正在使用一个函数来获取FSCalendar的numberOfEventsFor和eventDefaultColorsFor中的日期谓词:

func negativeTransactionPredicate(date: Date) -> NSPredicate {
        let calendar = Calendar(identifier: Calendar.Identifier.gregorian)
        var components = calendar.dateComponents([.year,.month,.day,.hour,.minute,.second],from: date)
        
        components.hour = 00
        components.minute = 00
        components.second = 00
        
        let startDate = calendar.date(from: components)
        
        components.hour = 23
        components.minute = 59
        components.second = 59
        
        let endDate = calendar.date(from: components)
        
        return NSPredicate(format: "transactionDate >= %@ && transactionDate =< %@ && transactionAmount < 0",argumentArray: [startDate!,endDate!])
    }
    
    func positiveTransactionPredicate(date: Date) -> NSPredicate {
        let calendar = Calendar(identifier: Calendar.Identifier.gregorian)
        var components = calendar.dateComponents([.year,from: date)
        
        components.hour = 00
        components.minute = 00
        components.second = 00
        
        let startDate = calendar.date(from: components)
        
        components.hour = 23
        components.minute = 59
        components.second = 59
        
        let endDate = calendar.date(from: components)
        
        return NSPredicate(format: "transactionDate >= %@ && transactionDate =< %@ && transactionAmount > 0",endDate!])
    }

我尝试建立一个正负谓词功能,但无法正常工作:

func positiveAndNegativeTransactionPredicate(date: Date) -> NSPredicate {
        let calendar = Calendar(identifier: Calendar.Identifier.gregorian)
        var components = calendar.dateComponents([.year,from: date)
        
        components.hour = 00
        components.minute = 00
        components.second = 00
        
        let startDate = calendar.date(from: components)
        
        components.hour = 23
        components.minute = 59
        components.second = 59
        
        let endDate = calendar.date(from: components)
        
        return NSPredicate(format: "transactionDate >= %@ && transactionDate =< %@ && transactionAmount > 0 || transactionAmount < 0",endDate!])
    }

我可以使一个红色或绿色的点与numberOfEventsFor一起正常工作:

func calendar(_ calendar: FSCalendar,numberOfEventsFor date: Date) -> Int {

        let incomeTransaction = realm.objects(Transaction.self).filter(positiveTransactionPredicate(date: date))

        let expenseTransaction = realm.objects(Transaction.self).filter(negativeTransactionPredicate(date: date))

        for _ in incomeTransaction {
            return 1
        }
        for _ in expenseTransaction {
            return 1
        }

        return 0
    }

和eventDefaultColorsFor:

func calendar(_ calendar: FSCalendar,appearance: FSCalendarAppearance,eventDefaultColorsFor date: Date) -> [UIColor]? {
        
        let incomeTransaction = realm.objects(Transaction.self).filter(positiveTransactionPredicate(date: date))
        
        let expenseTransaction = realm.objects(Transaction.self).filter(negativeTransactionPredicate(date: date))
        
        for _ in incomeTransaction {
            return [UIColor(rgb: Constants.green)]
        }
        for _ in expenseTransaction {
            return [UIColor(rgb: Constants.red)]
        }
        
        return nil
    }

但是如果同一天有收入交易和费用交易,我不知道如何返回2个点。

有人知道如何正确返回正确数量的点吗?

我非常感谢您的帮助,我花了无数小时试图弄清楚这一点。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)