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