用户输入的数据未保存或显示在tableview中

时间:2017-02-14 16:24:18

标签: ios swift uitableview core-data

我在尝试附加名为products的核心数据实体时遇到问题 - 我使用的代码与我用来添加companies的代码相同,效果很好。该应用程序的唯一区别是,我猜你可以说只有一个公司的“静态”桌面视图,而产品的tableview是根据挖掘的公司单元格动态设置的。但我不确定这会导致这个问题。

自昨天以来,我一直在调试/检查整个应用程序的值,似乎无论我尝试改变什么,products.count中的numberOfRowsInSection仍为0

当用户在三个文本字段中输入新值后点击完成按钮时,我调用了一个名为handleSave()的函数,就像我的其他对象companies一样:

func handleSave() {

    guard let newProductUrl = NSURL(string: urlTextField.text!) else {
        print("error getting text from product url field")
        return
    }
    guard let newProductName = self.nameTextField.text else {
        print("error getting text from product name field")
        return
    }
    guard let newProductImage = self.logoTextField.text else {
        print("error getting text from product logo field")
        return
    }


    self.productController?.save(name: newProductName, url: newProductUrl as URL, image: newProductImage)


    let cc = UINavigationController()
    let companyController = CompanyController()
    viewController = companyController
    cc.viewControllers = [companyController]
    present(cc, animated: true, completion: nil)


}

然后调用save函数追加products

func save(name: String, url: URL, image: String) {

    guard let appDelegate =
        UIApplication.shared.delegate as? AppDelegate else {
            return
    }

    let managedContext =
        appDelegate.persistentContainer.viewContext

    let entity =
        NSEntityDescription.entity(forEntityName: "Product",
                                   in: managedContext)!

    let product = NSManagedObject(entity: entity,
                                  insertInto: managedContext)


    product.setValue(name, forKey: "name")
    product.setValue(url, forKey: "url")
    product.setValue(image, forKey: "image")

    do {
        try managedContext.save()
        products.append(product)
    } catch let error as NSError {
        print("Could not save. \(error), \(error.userInfo)")
    }
    tableView.reloadData()
}

数据在viewWillAppear

中提取
override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

    guard let appDelegate =
        UIApplication.shared.delegate as? AppDelegate else {
            return
    }
    let managedContext =
        appDelegate.persistentContainer.viewContext

    let companyToDisplay = self.navigationItem.title!

    let fetchRequest =
        NSFetchRequest<NSManagedObject>(entityName: "Product")

    fetchRequest.predicate = NSPredicate(format:"company.name == %@",companyToDisplay)

    do {
        products = try managedContext.fetch(fetchRequest)
        print(products)
    } catch let error as NSError {
        print("Could not fetch. \(error), \(error.userInfo)")
    }
}

当使用完全相同的过程添加companies时,新公司会出现在tableview中。但是现在有产品,情况并非如此; tableview仍然是空的。我不确定区别是什么,我对核心数据的经验不足,我觉得我可以找出问题所在。

非常感谢能够解决这个问题的任何人!

2 个答案:

答案 0 :(得分:0)

调用handleSave()&amp;在执行table.reloadData()之前,您需要在viewWillAppear()中执行数据库提取操作。
fetchRequest逻辑从viewWillAppear()中隔离出来,转换为名为fetchUpdatedData()的函数。
现在,在try managedContext.save()之后,执行fetchUpdatedData(),更新您的product 数据阵列&amp;然后按table.reloadData()

更新用户界面

答案 1 :(得分:0)

使用NSFetchedResultsController让您的视图与您的模型保持同步。 NSFetchedResultsController监视核心数据并在有更新时发送委托消息 - 然后您可以更新您的tableview。否则,只要核心数据发生变化,您就必须手动执行刷新。