核心数据未在表视图中获取

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

核心数据对象被保存,但在我弹出相关对象表然后出现之前不会出现在表中

在表视图中使用 JSON 编码错误

表视图数据未在 Alamofire 发布请求调用 swift 3 中显示

无法在表视图中列出数据 [关闭]