【问题标题】:CoreData entities to UITableView with sections带有部分的 UITableView 的 CoreData 实体
【发布时间】:2015-12-31 16:43:24
【问题描述】:

我的数据模型很简单,就像一本普通的字典:

字母是字母表中的字母,单词是字典中的单词和定义。我的目标是在 UITableView 中显示数据,其中字母是部分,下面是单词。

我的代码:

 var fetchedResultsController: NSFetchedResultsController!

 override func viewDidLoad() {
    super.viewDidLoad()


    let appDel: AppDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
    let context: NSManagedObjectContext = appDel.managedObjectContext

    let fetchRequest = NSFetchRequest(entityName: "Letter")

    let letterSort =
    NSSortDescriptor(key: "letterName", ascending: true)
    fetchRequest.sortDescriptors = [letterSort]

    fetchedResultsController =
        NSFetchedResultsController(fetchRequest: fetchRequest,
            managedObjectContext: context,
            sectionNameKeyPath: "letterName",
            cacheName: "dict")

    fetchedResultsController.delegate = self

    do {
        try fetchedResultsController.performFetch()
    } catch let error as NSError {
        print("Error: \(error.localizedDescription)")
    }
 }


func numberOfSectionsInTableView
    (tableView: UITableView) -> Int {
        return fetchedResultsController.sections!.count
}

func tableView(tableView: UITableView,
    titleForHeaderInSection section: Int) -> String? {
        let sectionInfo =
        fetchedResultsController.sections![section]
        return sectionInfo.name
}
func tableView(tableView: UITableView,
    numberOfRowsInSection section: Int) -> Int {
        let sectionInfo =
        fetchedResultsController.sections![section]
        print(sectionInfo.numberOfObjects)
        return sectionInfo.numberOfObjects
}

我从教程中学到了这段代码。它似乎工作。节数等于 26,每个标题是 a 到 z。

问题是如何获取一个部分的行数,以及如何引用数据以将它们排成一行?

【问题讨论】:

    标签: swift uitableview core-data ios9


    【解决方案1】:

    我认为这段代码不会做你想做的事。通常,用于构造填充UITableView 或UICollectionView 的NSFetchedResultsController 的NSFetchRequest 必须获取您实际想要显示的实体类型(否则事情会变得复杂)。你有没有尝试过这样的事情?

    let appDel: AppDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
    let context: NSManagedObjectContext = appDel.managedObjectContext
    
    let fetchRequest = NSFetchRequest(entityName: "Word")
    
    let letterSort =
    NSSortDescriptor(key: "letter.letterName", ascending: true)
    let wordSort = NSSortDescriptor(key: "word", ascending: true)
    fetchRequest.sortDescriptors = [letterSort, wordSort]
    
    fetchedResultsController =
        NSFetchedResultsController(fetchRequest: fetchRequest,
            managedObjectContext: context,
            sectionNameKeyPath: "letter.letterName",
            cacheName: "dict")
    
    fetchedResultsController.delegate = self
    
    do {
        try fetchedResultsController.performFetch()
    } catch let error as NSError {
        print("Error: \(error.localizedDescription)")
    }
    

    假设您的单词值和相关字母是正确的,我认为这应该可以满足您的要求。还值得注意的是,cacheName 在您的应用程序中必须是唯一的,因此您可能需要比简单的 "dict" 更复杂的东西。

    【讨论】:

    • 这看起来几乎是对的,但是您必须添加一个与sectionNameKeyPath相对应的第一个排序描述符。
    • 如果排序顺序不会受到影响,您不必明确这样做。因此,我对单词值和相关字母的假设。你的建议会让它更正确,但是我会更新这个例子。
    • 这似乎行得通。您如何引用要在单元格中显示的数据? (对不起,这有点新)
    • @lascoff:如果您在 Xcode 中创建一个新的“主从应用程序”并激活“使用核心数据”复选框,那么您将免费获得所有必要方法的示例代码......: )
    • 您将使用NSFetchedResultsController 的方法来获取与单元格的indexPath 对应的对象,然后引用它们的属性并将它们设置为您的单元格的标签或其他出口。正如@MartinR 指出的那样,当然有很多关于如何做到这一点的教程。
    猜你喜欢
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-09
    • 2014-01-21
    相关资源
    最近更新 更多