ios - 通过 CoreData 属性显示 tableView 项目

标签 ios swift uitableview core-data

我正在尝试通过项目的“类别”属性对我的 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/

相关文章:

ios - Swift 中两个 TableView 之间的水平分页

ios - 如何在 Swift 开始时禁用按钮触摸

ios - 在tableviewcell中显示视频的缩略图

iOS11 UITableview reloadRowsAtIndexPaths 故障

ios - 如何使用 SKAudioNode

ios - 创建不可重用的单元格 UICollectionView

iphone - 关闭/呈现模态视图 Controller - viewdidLoad 再次调用

UITableViewRowAction : Delete

ios - 如何使用 UISearchBar 过滤 NSDictionary?

ios - PushViewController 两次当我双击太快时