首页 > 解决方案 > 根据 NSManagedObject 数组中的特定属性来调节 tableview 数据和行数的最佳方法是什么

问题描述

我有一个带有日期属性的 nsmanagedobject 数组。我试图让我的表格视图只加载具有今天日期属性的对象。设置行数并根据任何 nsmanagedobject 数组中的属性设置单元格的最佳方法是什么。我可以使用多个数组来解决它,但这会使我的代码成为这样的消息,尤其是在我的上下文操作中。任何帮助或提示表示赞赏:) 我在一个 tableview 控制器中有多个 tableview,我有一个数组来填充它们。

标签: swiftxcodeuitableview

解决方案


编辑:

根据您的代码执行此操作的另一种方法很可能不是执行此操作的最佳方法,即使用如下过滤器函数:

首先,将此函数添加到日期扩展中:

extension Date {
   func isSameDate(_ comparisonDate: Date) -> Bool {
        let order = Calendar.current.compare(self, to: comparisonDate, toGranularity: .day)
        return order == .orderedSame
    }
}

然后过滤您现有的数组(请记住,除非您存储该过滤后的数组,否则您将多次过滤 - 在 numberOfRows 和 cellForRow 中):

let todaysItems = items.filter{ $0.isSameDate(Date()) }

您可以通过简单地创建一个函数来做到这一点:

func loadTodaysItems() -> [Item] {
    let request: NSFetchRequest<Item> = Item.fetchRequest()
    let startDate = Date().startOfDay
    let endDate = Date().endOfDay
    request.predicate = NSPredicate(format: "date != nil AND date >= %@ AND date <= %@", startDate as NSDate, endDate as NSDate)
    /// (Optional) if you want to sort items by date
    request.sortDescriptors = [NSSortDescriptor(key: "date", ascending: true)]
    
    do {
        return try context.fetch(request)
    } catch {
        print("Error fetching data from context: \(error)")
    }
    return []
}

另外,请确保添加此扩展程序:

 extension Date {   
    var startOfDay: Date {
        return Calendar.current.startOfDay(for: self)
    }
    
    var endOfDay: Date {
        var components = DateComponents()
        components.day = 1
        components.second = -1
        return Calendar.current.date(byAdding: components, to: startOfDay)!
    }
 }

推荐阅读