fse*_*lva 5 casting core-data uitableview nsfetchedresultscontroller swift
我真的不知道我必须解释什么,如果需要,请不要犹豫,问我更多代码或解释。我正在尝试使用 CoreData 来存储从 http POST 请求中获取的数据,然后打印它们在 UITableView 上。
我成功地从 JSON 获取数据并将它们发送到数据库。问题是当我尝试将数据从数据库发送到 UITableView 时。
这是我第一次使用 Core Data,所以为了了解它是如何工作的,我遵循了本教程,我适应了我的情况:https : //www.youtube.com/watch?v=UniafUWsvLg
这是我工作的实体:
import Foundation
import CoreData
class Task: NSManagedObject {
@NSManaged var summary: String
@NSManaged var status: String
@NSManaged var responsable: String
@NSManaged var id: String
@NSManaged var detail: String
@NSManaged var date: String
@NSManaged var context: String
}
Run Code Online (Sandbox Code Playgroud)
这是准备 CoreData 工作的代码的一部分,我对此有一些评论:
//Preparing variables used to get and send datas from DB
let context = (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext
var nTask: Task? = nil
var frc : NSFetchedResultsController = NSFetchedResultsController()
func getFetchedResultsController() -> NSFetchedResultsController{
frc = NSFetchedResultsController(fetchRequest: taskFetchRequest(), managedObjectContext: context!, sectionNameKeyPath: nil, cacheName: nil)
return frc
}
func taskFetchRequest() -> NSFetchRequest {
//On which Entity are we working?
let fetchRequest = NSFetchRequest(entityName: "Task")
//Which attribute get the Order by. There summary as Ascending
let sortDescriptor = NSSortDescriptor(key: "summary", ascending: true)
fetchRequest.sortDescriptors = [sortDescriptor]
return fetchRequest
}
Run Code Online (Sandbox Code Playgroud)
现在我已经声明了这一点,我在 viewDidLoad 上将 getFetchedResultsController 的委托设置为 self:
override func viewDidLoad() {
super.viewDidLoad()
frc = getFetchedResultsController()
frc.delegate = self
frc.performFetch(nil)
}
Run Code Online (Sandbox Code Playgroud)
这就是我创建数据库链接以从以下位置获取数据的方式:
//Link creation to SQLite DB
let context = self.context
let ent = NSEntityDescription.entityForName("Task", inManagedObjectContext: context!)
let nTask = Task(entity: ent!, insertIntoManagedObjectContext: context)
Run Code Online (Sandbox Code Playgroud)
然后我用从 JSON 中提取的字符串填充我的 nTask,我保存上下文并重新加载数据库:
for dict in json2 {
var apps = [String]()
if let summary = dict["summary"] as? String{
nTask.summary = summary
}
if let description = dict["description"] as? String{
nTask.detail = description
}
if let context = dict["context"] as? String{
nTask.context = context
}
if let due = dict["due"] as? String {
nTask.date = due
}
if let status = dict["status"] as? String{
nTask.status = status
}
if let responsible = dict["responsible"] as? String{
nTask.responsable = responsible
}
if let id = dict["id"] as? String{
nTask.id = id
}
}
context?.save(nil)
println(nTask)
self.tableView.reloadData()
Run Code Online (Sandbox Code Playgroud)
当我们使用 a 时TableView,我们必须声明cellForRowAtIndexPathand numberOfRowsInSection,它们是:
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
var cell: UITableViewCell = self.tableView.dequeueReusableCellWithIdentifier("customTableViewCell") as! UITableViewCell
let task = frc.objectAtIndexPath(indexPath) as! Task
cell.textLabel?.text = task.summary
var detail = task.detail
var context = task.context
var due = task.date
var status = task.status
var responsible = task.responsable
cell.detailTextLabel?.text = "Contexte: \(context), Detail: \(detail), Status: \(status), Ending date: \(due)"
return cell
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
let numberOfRowsInSection = frc.sections?[section].numberOfObjects
return numberOfRowsInSection!
}
Run Code Online (Sandbox Code Playgroud)
错误let task = frc.objectAtIndexPath(indexPath) as! Task在我的 cellForRowAtIndexPath 上。
完整的错误是: Could not cast value of type 'NSManagedObject_Task_' (0x79ebd190) to 'TaskManager.Task' (0xa1f08).
我搜索了半天多没有结果。我真的不明白我这是怎么了...
很抱歉提供了这么多代码,但我不知道在哪里或为什么会出现此错误,因此我必须提供尽可能多的信息。
非常感谢您阅读到最后,感谢您的帮助。
问候。
编辑:
我终于通过做几件事解决了我的问题。我真的不知道哪个解决了......我@objc(Task)在我的 Task 类上添加了注释,在我的 DataModel 上我将类更改为 Task,检查了我的 NSManagedObjectModellet modelURL = NSBundle.mainBundle().URLForResource("TaskManager", withExtension: "momd")!和let url = self.applicationDocumentsDirectory.URLByAppendingPathComponent("TaskManager.sqlite")AppDelegate 上的url ..
感谢您的帮助。
尝试:
let task = frc.objectAtIndexPath(indexPath) as NSManagedObject
Run Code Online (Sandbox Code Playgroud)
也许您遇到的真正问题不是其“cellForRowAtIndexPath”中的提取而是在其“FOR”中:
for dict in json2 {
...
if let summary = json2["summary"] as? String{
nTask.summary = summary
}
...
Run Code Online (Sandbox Code Playgroud)
你正在寻找"summary"什么"dict"时候应该得到它"json2"
| 归档时间: |
|
| 查看次数: |
3733 次 |
| 最近记录: |