按CoreData属性

时间:2016-02-09 12:59:23

标签: ios swift uitableview core-data

我正在尝试按照"类别"对第0部分我的tableView进行分组。项目的属性。

示例:

  

饮料:(item.category = header)
  Prepper博士   可乐
  百事可乐
  厨房:(item.category = header)
  花盆
  盘...等。
  CrossOff(标题)
  项目

我仍然希望section1成为item.slcross(如果每个组必须是他们自己的部分,那么最后一部分......并且它不必被分组)。

当我从" slitem"更改secondarySortDescriptor键时到" 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
}

TableViewHeaders:

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
    }
}

2 个答案:

答案 0 :(得分:1)

有几种方法可以做到这一点,但最简单的方法是向NSManagedObject子类添加新方法。该方法返回一个字符串,该字符串将用作该节的标题;因此,如果slcross为false,则返回slcategory的值,如果slcross为true,则返回“True”:

func sectionIdentifier() -> String {
    if (self.slcross) {
        return "True"
    } else {
        return "\(self.slcategory)"
    }
}

(请注意,此代码位于List类定义中,而不是视图控制器中。

在视图控制器中,将此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
    }
}

答案 1 :(得分:0)

来自Apple Docs ......

  

初始化获取结果控制器时,您提供了四个参数:.....   ....(可选)返回节名称的结果对象上的键路径。控制器使用键路径将结果拆分为多个部分(传递nil表示控制器应生成单个部分).....   创建实例后,调用performFetch:实际执行fetch。

如果要按类别对部分进行排序,则需要将replaceAll() init中的sectionNameKeyPath参数设置为“类别”属性,而不是“slcross”属性。

当我过去使用过这个时,我还包含了我在排序描述符中设置为sectionNameKeyPath的相同属性,但不确定是否真的需要它。

希望我已经回答了你的问题?