【问题标题】:Updating navigation in Viewcontrollers - Coredats在 Viewcontrollers 中更新导航 - Coredats
【发布时间】:2016-11-24 11:25:40
【问题描述】:

我是一名使用 Swift 的新程序员。 在我的项目中,我使用了 coredata 和很多视图控制器。

我有这个视图控制器:

Viewcontroller1 有我家的 Viewcontroller (VC1)。 Viewcontroller2 (VC2),带有从我的 coredata 重新加载的项目列表(在表格视图中)。 Viewcontroller2(VC3),列出了VC2中选中项的属性。 Viewcontroller2 (VC4),让用户在VC2中编辑选中项的属性。

这是我的导航:VC1 -> VC2 -> VC3 -> VC4。

问题: 假设我在 VC1 并转到 VC2。 我现在从视图控制器中选择一个项目,它会将我带到 VC3(我推送 VC3)。 我现在在项目特性。这些是从 coredata 中列出的。 为了编辑它们,我制作了一个带有 segue 的按钮 VC4,我在其中创建了一个视图,用户可以在其中更改所选项目的值。一旦用户在文本字段中引入任何更改,我就会执行 NSFetchRequest,并像这样更新值:

@IBAction func saveButton(_ sender: UIBarButtonItem) {

    let app = UIApplication.shared.delegate as! AppDelegate
    let context = app.persistentContainer.viewContext
    let request = NSFetchRequest<NSFetchRequestResult>(entityName: "Simulator")

    do {

        let results = try context.fetch(request)

        if results.count > 0 {

            for result in results as! [NSManagedObject] {

                result.setValue(designLabel.text, forKey: "designation")
                result.setValue(typeLabel.text, forKey: "type")
                result.setValue(localLabel.text, forKey: "local")     
                do {
                    try context.save()
                } catch {
                    print("Error updating")
                }


            }
        }
    } catch {

        print ("Error")
    }
    _ = self.navigationController?.popViewController(animated: true)

}

所以现在,通过按 saveButton 我更新本地、名称和类型属性,然后弹出 VC3。 现在在 VC3 中,我希望收到更新值。相反,我收到的是旧值。这就是我在 VC3 中所拥有的:

 override func viewWillAppear(_ animated: Bool) {

    super.viewDidAppear(animated)

    map.delegate = self

    let fetchRequest:NSFetchRequest<Simulator> = Simulator.fetchRequest()

    do{
        let searchResults = try DatabaseController.getContext().fetch(fetchRequest)

        for result in searchResults as [Simulator]{

            if (String(describing: result.objectID) == choosenID)
            {
                self.title = result.designation
                localLabel.text = "Local: \(result.local!)"
                typeLabel.text =  "Type: \(result.type!)
                print("I found it") //to check if I go inside this = and I go inside (true)

            {
        }
    }
    catch{
        print("Error: \(error)")
    }

   }      
}

现在我按下后退按钮并转到 VC2:一些东西。在标签上有名称的单元格仍然没有更新它。 所以我去VC!使用后退按钮。 现在,如果我前进到 VC2 或 VC3,一切都会更新。

发生了什么?为什么我从 VC4 弹出到 VC3 时它不更新?

【问题讨论】:

  • 您是否尝试过在返回时重新加载数据?
  • 我想我知道为什么。我没有在我应该更新的地方更新数据......

标签: swift core-data uiviewcontroller swift3


【解决方案1】:

当您返回时,您将返回到原来的视图,当您前进时,您正在重新加载它。但是,您可以做的是在返回时重新加载数据。

【讨论】:

  • 我明白了。我怎样才能做到这一点?请告诉我好吗?
  • 听起来你有一个 tableview,你需要从 viewWillAppear 或观察者更新数据源,然后调用 tableview.reloadData()
  • 但我在 VC4 或 VC3 中没有任何 tableview。我在 VC2 中只有表格视图。那么为什么我来VC4到VC3时它不更新呢?我弹出 VC3,并在 func viewWillAppear(_ animated: Bool) 中在 VC3 中编写了上面的代码。它应该工作不?我正在再次获取结果...
  • 那么您将需要构建一个为您重新加载视图并在每次您想要更新数据时调用它的函数。
  • 当我弹出一个视图控制器时,如果我在 viewwillappear 中执行它(在那个视图控制器中)它应该可以工作。对吗?
猜你喜欢
  • 2012-05-19
  • 2012-03-20
  • 1970-01-01
  • 1970-01-01
  • 2013-06-27
  • 2020-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多