微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决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 举报,一经查实,本站将立刻删除。