gpt4 book ai didi

ios - 在 UITableViewCell 返回 View 后,NSManagedObject 数据为 且实体为空

转载 作者:搜寻专家 更新时间:2023-10-31 21:57:35 27 4
gpt4 key购买 nike

我看到使用 Swift 和 Xcode 7.2 的 Core Data 有一些非常奇怪的行为。下面是说明该问题的动画。

Problem

我创建了一个简单的示例,其中包含一个名为“Person”的实体,它只有一个“name”属性。我获取所有“人”实体并将它们显示在 TableView 中。如果我强制重新加载一个单元格,那么保存名称的 textLabel 和 NSManagedObject objectID 将不显示名称。但是,objectID 保持不变。这在设备和模拟器中都会发生。

我在“cellForRowAtIndexPath”中将 Person 实体的值打印到控制台,这样我就可以显示单元格最初加载时和重新加载时的值。

Person entity value

如您所见,尽管 NSManagedObject 似乎丢失了对其“Person”子类的所有引用,但它似乎仍然存在。

这里是受影响的 ViewController 的代码:

class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
let cellIdentifier = "PersonCell"

@IBOutlet weak var tableView: UITableView!

var people: NSArray = []

override func viewDidLoad() {
super.viewDidLoad()

people = fetchPeople()
}

func fetchPeople() -> NSArray {
let context = AppDelegate().managedObjectContext
let fetchRequest = NSFetchRequest(entityName: "Person")
let sort = NSSortDescriptor(key: "name", ascending: true)
fetchRequest.sortDescriptors = [sort]

do {
let results = try context.executeFetchRequest(fetchRequest)
return results
} catch {
let error = error as NSError
print("\(error.domain) \(error.code): \(error.localizedDescription)")
return []
}
}

// MARK: - UITableView methods

func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return 1
}

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return people.count
}

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier, forIndexPath: indexPath)

let person = people[indexPath.row]
print("in cellForRowAtIndexPath:")
print(people[0])

cell.textLabel?.text = "\(person.name) - \(person.objectID)"
return cell
}
}

感谢任何帮助。谢谢。

最佳答案

问题出在这里:

let context = AppDelegate().managedObjectContext

您创建应用程序委托(delegate)的新实例,并使用它托管对象上下文。一旦程序控制从 fetchPeople() 返回,就不再有对上下文的引用,它是释放。效果是访问托管对象的属性在此上下文中创建的返回 nil

您想要的是获得对(唯一)应用程序委托(delegate)的引用及其托管对象上下文,例如

let context = (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext

或者,将上下文传递给 View Controller didFinishLaunchingWithOptions 方法或在prepareForSegue 或适合您应用的任何内容。

关于ios - 在 UITableViewCell 返回 View 后,NSManagedObject 数据为 <fault> 且实体为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34999852/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com