创建 TableViewCells 的核心数据 Swift

Core Data to create TableViewCells Swift

所以我试图用 Core Data 创建一个 TableViewCell,但是在定义单元格时,它们都在 Core Data 中输入了最后一个输入。该应用正在获取用户文本字段输入并转换为 table 视图单元格标签,并将 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 时,我可以看到所有输入及其各自的值

您的设置不正确。您应该使用 NSFetchedResultsController(请参阅 Xcode 模板以轻松复制代码)——这是使用核心数据填充 table 视图的最佳方式。

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

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

顺便说一句,"Cells" 似乎是一个不合适的实体名称。您需要一个描述您正在显示的数据的单数。也许,"Favorite"?

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

var results : NSArray = NSArray()

在您的 class 定义的开头。然后移动代码以将数组从 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 指示 table 视图请求的行(和部分,如果您将 table 视图分成部分)。所以你的代码不需要遍历 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 的速度)。

如果您的数据相对静态(即在显示 table 视图时不会改变)并且您不想将 table 分解为部分。在这两种情况中的任何一种(并且,有些人会说,在任何情况下),您都应该使用 NSFetchedResultsController。这将自动跟踪每个部分中出现了多少(和哪些)项目等,并且还可以配置为自动更新 table如果在显示数据时将新项目添加到数据中。