核心数据未在表视图中获取
Posted
技术标签:
【中文标题】核心数据未在表视图中获取【英文标题】:Core Data not fetching in table view 【发布时间】:2018-01-22 16:38:59 【问题描述】:我下面的代码是使用核心数据将实体添加到表格视图中。问题是当我点击按钮添加新条目时,数据不会显示在表格视图上。但是如果我退出模拟器并重新安装应用程序,实体就在那里。要显示实体,我必须输入它,然后重新安装应用程序才能显示实体。
import UIKit
import CoreData
class ViewController: UIViewController
@IBOutlet var rot: UITableView!
@IBOutlet var enterName: UITextField!
var people : [NSManagedObject] = []
override func viewDidLoad()
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
showdata()
@IBAction func iDontLikeSchool(_ sender: Any)
if(enterName.text?.isEmpty)!
alertmsg(name: "d")
showdata()
else
saveData(name: enterName.text!)
func alertmsg(name:String)
let alert = UIAlertController(title: "D", message: "d", preferredStyle: UIAlertControllerStyle.alert)
alert.addAction(UIAlertAction(title: "ok", style: UIAlertActionStyle.default, handler: nil))
self.present(alert, animated: true, completion: nil)
func saveData(name: String)
guard let appDelage = UIApplication.shared.delegate as? AppDelegate else
return
let managedContext = appDelage.persistentContainer.viewContext
let ee = NSEntityDescription.entity(forEntityName: "PersonalInfo", in: managedContext)!
let person = NSManagedObject(entity : ee , insertInto: managedContext)
person.setValue(name, forKey: "userName")
do
try managedContext.save()
people.append(person)
alertmsg(name: "saved")
enterName.text = ""
catch let err as NSError
print("judo",err)
///
func showdata()
guard let appDelage = UIApplication.shared.delegate as? AppDelegate else
return
let managedContext = appDelage.persistentContainer.viewContext
let fetchReuqst = NSFetchRequest<NSManagedObject>(entityName: "PersonalInfo")
do
people = try managedContext.fetch(fetchReuqst)
if people.count == 0
else
catch let err as NSError
print("judo", err)
///
extension ViewController: UITableViewDataSource, UITableViewDelegate
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
let cell = rot.dequeueReusableCell(withIdentifier: "Person")
let personn = people[indexPath.row]
cell?.textLabel?.text = personn.value(forKey: "userName") as? String
return cell!
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
return people.count
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)
【问题讨论】:
【参考方案1】:该条目未显示的原因是您没有告诉视图您的模型已更改,因此它不会自行刷新。
tableView 在viewDidLoad
上渲染一次,这就是为什么在重新加载视图后(在您的应用重新启动后)数据可以正确显示的原因。
要解决此问题,请将 viewController 的 tableView 保留为属性(如果您使用 Storyboard,则为 @IBOutlet)并调用
tableView.reloadData()
在您更改数据后,在您的情况下,例如在你的func showData()
的末尾像这样。
func showdata()
guard let appDelage = UIApplication.shared.delegate as? AppDelegate else
return
let managedContext = appDelage.persistentContainer.viewContext
let fetchReuqst = NSFetchRequest<NSManagedObject>(entityName: "PersonalInfo")
do
people = try managedContext.fetch(fetchReuqst)
if people.count == 0
//sth
else
// sth
catch let err as NSError
print("judo", err)
tableView.reloadData()
【讨论】:
以上是关于核心数据未在表视图中获取的主要内容,如果未能解决你的问题,请参考以下文章
获取结果崩溃(使用 persistentContainer) - 核心数据目标 C
核心数据对象被保存,但在我弹出相关对象表然后出现之前不会出现在表中