Core Data创建TableViewCells Swift

时间:2015-01-03 23:47:34

标签: ios xcode uitableview core-data swift

所以我试图用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时,我可以看到所有输入及其各自的值

2 个答案:

答案 0 :(得分:1)

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

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

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

BTW,“细胞”似乎是一个不合适的实体名称。您需要一个描述您正在显示的数据的单数。也许,“最喜欢的”?

答案 1 :(得分:0)

根据我的评论,要使当前设置正常工作,请将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。