如何解决FSCalendar numberOfItems用于使用Realm进行日期过滤
这困扰了我很久了。我最初是在一个月前问这个问题,但仍然无法正常工作:
How do I show 2 different color dots for a date using FSCalendar?
我想证明:
我的交易数据模型如下:
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 举报,一经查实,本站将立刻删除。