在 tableView 中显示过滤数组中的数据
Posted
技术标签:
【中文标题】在 tableView 中显示过滤数组中的数据【英文标题】:Displaying data in a tableView from a filtered array 【发布时间】:2016-07-08 20:33:28 【问题描述】:我编写了从 Core Data 过滤事件的代码,并且只打印日期属性等于日历中选择的日期的事件。代码如下:
let predicate = NSPredicate(format: "eventPastStringDate = %@", formatter.stringFromDate(selectedDate))
//This prints the exact data that I want
print((eventsPast as NSArray).filteredArrayUsingPredicate(predicate))
这很有效,它会过滤我想要的数据,并且只打印我想要的事件。问题是我不知道如何在 tableView 中显示这些数据。通常我可以在 cellForRowAtIndexPath 中像这样在 tableView 中显示 Core Data 中的所有数据...
let ePast = eventsPast[indexPath.row]
let cellPast = self.tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! CustomCell
// Sets labels in cell to whatever user typed in on the events page
cellPast.titlePrototypeCell!.text = ePast.eventPastTitle!
cellPast.datePrototypeCell!.text = "Date: " + ePast.eventPastDateLabel!
return cellPast
...但我不确定如何像上面那样以数组的形式访问新数据。有任何想法吗?
【问题讨论】:
这是斯威夫特!使用像filter
这样的原生 Swift 函数,而不是桥接到 NSArray
和 NSPredicate
。只需将过滤操作的结果分配给数据源数组即可。
如果你有机会可以举个例子吗?我已经查看了所有内容,这似乎是与 Core Data 一起使用的唯一方法。
从 Core Data 中获取过滤数据的最佳方式是分配给 fetch 请求的谓词。这里有数千个关于 SO 的示例以及 Core Data 文档中的示例代码如何做到这一点。
【参考方案1】:
您的班级中将有第二个数组。当没有过滤器时,这两个数组是相同的。当有过滤器时,您将拥有一个包含绝对所有内容的主数组,而过滤后的数组是一个小子集。
(class var) myFilteredArray = (eventsPast as NSArray).filteredArrayUsingPredicate(predicate)
然后在你的 tableview 方法中:
let ePast = myFilteredArray[indexPath.row]
并确保将表格行大小设置为过滤后的数组计数,而不是主数组计数。否则你会出界崩溃。
【讨论】:
我收到一个错误:“AnyObject”类型的值没有成员“eventPastTitle” 您的过滤器函数正在返回一个AnyObject
数组。将它投射到您所知道的课程中,然后继续生活。以上是关于在 tableView 中显示过滤数组中的数据的主要内容,如果未能解决你的问题,请参考以下文章
如何从属于 UITableView 中的模型数组对象的数组中向 tableView 显示数据?