创建 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如果在显示数据时将新项目添加到数据中。
所以我试图用 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如果在显示数据时将新项目添加到数据中。