【问题标题】:Core Data to create TableViewCells Swift创建 TableViewCells Swift 的核心数据
【发布时间】:2015-01-03 23:47:34
【问题描述】:

所以我正在尝试使用 Core Data 创建一个 TableViewCell,但是在定义单元格时,它们都在 Core Data 处输入最后一个输入。该应用程序将用户文本字段输入转换为表格视图单元格标签,并将 zipInStr 转换为 TableViewCell 详细信息。

这是将值添加到 CoreData 的函数:

 @IBAction func createFav(sender: AnyObject) {
       //Defining variables to save at core data
        var newTextInput = textInput.text
        var trimmNewTextInput = newTextInput.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceCharacterSet())
        var zipInStr: String = zipCode.text!


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

            var newFav = NSEntityDescription.insertNewObjectForEntityForName("Cells", inManagedObjectContext: context) as NSManagedObject

            newFav.setValue(zipInStr, forKey: "favsDictKey")
            newFav.setValue(trimmNewTextInput, forKey: "favsDictValues")

            context.save(nil)

            println(newFav)

        textInput.text = String()

        }
    }

这是创建 TableViewCells 的函数:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

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

    var request = NSFetchRequest(entityName: "Cells")
    request.returnsObjectsAsFaults = false


    let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as UITableViewCell

    var results: NSArray = context.executeFetchRequest(request, error: nil)!
    println(results)
    if (results.count == 0){
       println("Error")

    } else {

        for res in results{

            cell.textLabel?.text = res.valueForKey("favsDictValues") as? String
            cell.detailTextLabel?.text = res.valueForKey("favsDictKey") as? String
        }
    }
     return cell
}

我很确定错误与循环有关,因为当我打印 results 时,我可以看到所有输入及其各自的值

【问题讨论】:

  • 您应该执行该获取请求,并填充results,仅一次,可能在viewDidLoad 中。然后在cellForRowAtIndexPath 中使用indexPath.row 作为索引来访问results 数组中的相关项。或者看看 NSFetchResultsController ,它(带有一些样板代码)使得将 CoreData 映射到 tableView 非常简单。
  • 你能告诉我怎么做你说的第一种方法吗?我对 Core Data 真的很陌生,我真的很迷茫
  • 实际上我不确定我是否理解你的问题......“错误”是指这一行正在打印的事实 - “println(“Error”)”?还是您实际上遇到了错误?
  • 这个错误行没有给我错误只是让我知道没有指定单元格

标签: ios xcode uitableview core-data swift


【解决方案1】:

您的设置不正确。您应该使用NSFetchedResultsController(请参阅 Xcode 模板以获取易于复制的代码)——这是使用 Core Data 填充表格视图的最佳方式。

cellForRowAtIndexPath 中,您只需检索索引路径的正确项目。不要将获取请求放入此方法,因为它可能会被多次调用(例如,在滚动时)。

let cell = self.fetchedResultsController.objectAtIndexPath(indexPath) as Cells

顺便说一句,“细胞”似乎是一个不恰当的实体名称。您需要一个单数来描述您正在显示的数据。也许,“最爱”?

【讨论】:

    【解决方案2】:

    根据我的评论,要使您当前的设置正常工作,请将 results 设置为存储属性。添加

    var results : NSArray = NSArray()
    

    在类定义的开头。然后移动代码以将数组从您的cellForRowAtIndexPath 填充到viewDidLoad

    var appDel: AppDelegate = (UIApplication.sharedApplication().delegate as AppDelegate)
    var context:NSManagedObjectContext = appDel.managedObjectContext!
    
    var request = NSFetchRequest(entityName: "Cells")
    request.returnsObjectsAsFaults = false
    results = context.executeFetchRequest(request, error: nil)!
    println("\(results)")
    

    现在,tableView 将调用cellForRowAtIndexPath 多次,对于它想要显示的每一行调用一次。因此,该方法中的代码需要使用相关行的数据对其进行配置。作为调用参数提供的indexPath 指示tableView 请求的行(和部分,如果您将表视图分成部分)。因此,您的代码不需要遍历 results 中的所有值 - 它只需要引用数组的正确元素。

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    
        let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as UITableViewCell
    
        let res = results[indexPath.row] as NSManagedObject
        cell.textLabel?.text = res.valueForKey("favsDictValues") as? String
        cell.detailTextLabel?.text = res.valueForKey("favsDictKey") as? String
        return cell
    }
    

    这应该可以让您的 tableView 正常工作(除非我搞砸了一些可选选项或强制转换 - 如果是这样,抱歉,我仍在跟上 Swift 的速度)。

    如果您的数据是相对静态的(即在显示 tableView 时不会更改)并且您不想将表格分成几部分,则此方法可以正常工作。在任何一种情况下(有些人会说,无论如何),您都应该使用 NSFetchedResultsController。这将自动跟踪每个部分中出现了多少(以及哪些)项目等,并且还可以配置为在显示时将新项目添加到数据中时自动更新 tableView。

    【讨论】:

    • 谢谢,我在 youtube 上查看了一些教程,发现有一个展示了这种方法。现在我开始对 Core Data 有了更多的了解!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多