我正在尝试通过项目的“类别”属性对我的 tableView 的第 0 部分进行分组。
示例:
Drinks: (item.category = header)
Dr. Prepper
Coke
Pepsi
Kitchen: (item.category = header)
Pots
Pans...etc.
CrossOff(header)
items
我仍然希望 section1 是 item.slcross(或者如果每个组都必须是它们自己的部分,则为最后一个部分......并且它不必分组)。
当我将 secondarySortDescriptor 键从“slitem”更改为“slcategory”并使用下面的 sectionHeader 代码时,它返回“nil”。我也尝试使用
let sectionHeader2 = "\(item.valueForKeyPath("slcategory"))"
但对于“slitem”和“slcategory”仍然具有相同的效果。
我是否必须为每个类别使用排序描述符,或者是否有办法让它提取项目的类别属性并将类似的类别组合在一起?
FRC 设置:
let moc = (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext
var frc : NSFetchedResultsController = NSFetchedResultsController()
var selectedItem : List?
func itemFetchRequest() -> NSFetchRequest{
let fetchRequest = NSFetchRequest(entityName: "List")
let primarySortDescription = NSSortDescriptor(key: "slcross", ascending: true)
let secondarySortDescription = NSSortDescriptor(key: "slitem", ascending: true)
fetchRequest.sortDescriptors = [primarySortDescription, secondarySortDescription]
fetchRequest.predicate = NSPredicate(format:"slist == true")
return fetchRequest
}
func getFetchRequetController() ->NSFetchedResultsController{
frc = NSFetchedResultsController(fetchRequest: itemFetchRequest(), managedObjectContext: moc, sectionNameKeyPath: "slcross", cacheName: nil)
return frc
}
表格 View 标题:
func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String?{
let entityDescription = NSEntityDescription.entityForName("List", inManagedObjectContext: moc)
let item = List(entity: entityDescription!, insertIntoManagedObjectContext: moc)
let sectionHeader = "\(item.slcategory)"
let sectionHeader1 = "Items in Cart - #\(frc.sections![section].numberOfObjects)"
if (frc.sections!.count > 0) {
let sectionInfo = frc.sections![section]
if (sectionInfo.name == "0") {
return sectionHeader2
} else {
return sectionHeader1
}
} else {
return nil
}
}
最佳答案
有几种方法可以做到这一点,但最简单的方法可能是向 NSManagedObject
子类添加一个新方法。该方法返回一个字符串,该字符串将用作该部分的标题;所以如果 slcross
为假,它返回 slcategory
的值,如果 slcross
为真,它返回“True”:
func sectionIdentifier() -> String {
if (self.slcross) {
return "True"
} else {
return "\(self.slcategory)"
}
}
(请注意,此代码位于您的 List
类定义中,而不是您的 View Controller 中)。
在 View Controller 中,使用此 sectionIdentifier
作为您的 FRC 的 sectionNameKeyPath
:
frc = NSFetchedResultsController(fetchRequest: itemFetchRequest(), managedObjectContext: moc, sectionNameKeyPath: "sectionIdentifier", cacheName: nil)
要使其正常工作,必须正确排序对象:首先按 slcross
,然后按 slcategory
:
let primarySortDescription = NSSortDescriptor(key: "slcross", ascending: true)
let secondarySortDescription = NSSortDescriptor(key: "slcategory", ascending: true)
最后,修改您的 titleForHeaderInSection
以使用部分名称(FRC 从 sectionIdentifier
获取),但将“True”替换为您计算的字符串:
func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String?{
if (frc.sections!.count > 0) {
let sectionInfo = frc.sections![section]
if (sectionInfo.name == "True") {
return "Items in Cart - #\(sectionInfo.numberOfObjects)"
} else {
return sectionInfo.name
}
} else {
return nil
}
}
关于ios - 通过 CoreData 属性显示 tableView 项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35292752/