【问题标题】:User-entered data not being saved or appearing in tableview用户输入的数据未保存或出现在表格视图中
【发布时间】:2017-02-14 16:24:18
【问题描述】:

我在尝试附加一个名为 products 的核心数据实体时遇到问题 - 我使用了与添加 companies 相同的代码,它工作正常。该应用程序的唯一区别是,我猜你可以说只有一个公司的“静态”表格视图,而产品的表格视图是根据点击的公司单元格动态设置的。但我不确定这会如何导致问题。

从昨天开始,我一直在调试/检查整个应用程序的值,似乎无论我尝试更改什么,numberOfRowsInSection 中的products.count 仍然是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 时,新公司随即出现在表格视图中。但是现在有了产品,情况并非如此。表格视图仍然是空的。我不确定有什么区别,而且我对核心数据的经验不足,我觉得我可以找出问题所在。

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

【问题讨论】:

  • @doxi45 嗨,您是否尝试过在保存功能中打印值?
  • @TusharSharma ProductController 中的save 函数似乎没有被调用。 IE。如果我在该函数上放置一个断点,它不会中断程序,但是如果我在调用save 函数(self.productController?.save)的handleSave() 的行上放置一个断点,它会中断。所以我不确定发生了什么。
  • 如果这是真的,那么self.productController 就是nil
  • @d0xi45 我猜你的导航部分正在创建问题,你可以在没有导航的情况下测试它吗?意思是评论你的代码,呈现其他控制器,然后在两个函数上放置断点
  • @TusharSharma 这样做具有相同的结果,除了用户添加值的视图控制器显然没有被解除 - 但是save 上的断点在handleSave() 中的self.productController?.save 上的断点崩溃时什么也不做

标签: ios swift uitableview core-data


【解决方案1】:

在调用handleSave()之后&在执行table.reloadData()之前,你需要执行在viewWillAppear()中完成的db fetch操作。
将您的 fetchRequest 逻辑与 viewWillAppear() 分离到一个名为(比如说)fetchUpdatedData() 的函数中。
现在,在try managedContext.save() 之后,执行fetchUpdatedData(),更新您的product 数据数组,然后通过table.reloadData() 更新用户界面

【讨论】:

  • 我遵循了这些建议(请参阅我的编辑以查看我是否按照您的意愿这样做)并且表格仍未更新。我认为混淆是因为我的第一个视图控制器上的每个公司都有单独的产品,因此在检查navigationItem.title 之后动态设置了产品控制器表。所以也许程序不知道产品保存到哪个公司?如果您想看一看,这就是项目(点击编辑 -> 完成 -> 选择一家公司并尝试添加一些内容:dl.dropboxusercontent.com/u/17411581/NavCtrl.zip
  • 就像我在问题中所说的那样,我特别困惑,因为同样的handleSave() -> save 流程,具有完全相同的代码(减去获取股票价格)对于添加公司是成功的。但产品是另一回事。作为核心数据的初学者,这让我头晕目眩。
【解决方案2】:

使用NSFetchedResultsController 使您的视图与您的模型保持同步。 NSFetchedResultsController 监控核心数据并在有更新时发送委托消息 - 然后您可以更新您的表格视图。否则,每当核心数据发生变化时,您都必须手动进行刷新。

【讨论】:

  • 我的ProductController 类定义中已经有NSFetchedResultsController (这是我从模态视图AddProductController 获得的控制器,并且正在尝试返回。我还需要添加吗?将其更改为AddProductController,以及任何其他方法,或者更改我的viewDidAppear
猜你喜欢
  • 2023-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-04
相关资源
最近更新 更多