【问题标题】:Going from one ViewController to another ViewController and updating从一个 ViewController 到另一个 ViewController 并更新
【发布时间】:2016-11-23 22:50:03
【问题描述】:

现在我有 3 个这样的视图控制器:

HomeViewcontroller = VC1.
Viewcontroller2 = VC2 --> has a table view with cells on it.
Viewcontroller3 = VC3 --> allows me to edit each cell in VC2 or delete.

我在 Viewcontrollers 之间使用NavigationController,以获得漂亮的“返回”按钮 :)

假设我在 VC1 中,我按下一个按钮然后转到 VC2。 现在假设我有 4 个单元格。 我按 2 号单元格,然后转到 VC3,在那里我可以编辑单元格中的内容,甚至删除它。 这一切正常(经过测试)。

假设我想删除那个单元格。我在 VC3 上有一个按钮,我使用它并删除了单元格(经过测试并且工作正常)。

现在当我这样做时,我会像这样再次进入 VC2:

let viewController = storyboard?.instantiateViewController(withIdentifier: "VC2") as! VC2!
self.navigationController?.pushViewController(viewController!, animated: true)

问题是,当我这样做时,我去了 VC2,但我没有重新加载我的 tableView 有它应该(擦除的单元格它仍然存在)。

为了解决这个问题,我尝试在 VC2 的 viewDidLoad 中添加一些代码:

self.tableView.reloadData()

现在我设法做到了。我的意思是当我从 VC3 中删除一个单元格时,我被推送到 VC2 并且该单元格不存在。但是,如果我按下后退按钮,它会将我带到我已删除的上一个单元格,如果该单元格不再存在,我不希望它带我去那里。我想让它带我去 VC1(家)。

我怎样才能做到这一点?

也许我应该用另一种方式来做这件事,而不是那样推动?

【问题讨论】:

    标签: swift uitableview swift3


    【解决方案1】:

    实际上你做错了,当在 VC3 上完成删除/编辑操作并且你想回到 VC2 上时,你为什么要这样做 pushViewController ,你必须申请 popViewController

    你必须申请self.navigationController?.popViewController(animated: true)从VC3回到VC2。

    删除

    let viewController = storyboard?.instantiateViewController(withIdentifier: "VC2") as! VC2!
    self.navigationController?.pushViewController(viewController!, animated: true)
    

    添加

    self.navigationController?.popViewController(animated: true)
    

    还有

    将表视图的reloadData() 方法放在viewWillAppear 中。就像下面的代码。

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
    
        self.tableView.reloadData()
    
    }
    

    一些关于 UINavigationController 的参考资料。

    https://developer.apple.com/reference/uikit/uinavigationcontroller

    【讨论】:

    • 和我的回答一样。
    • 试过了。你是对的。而已。非常感谢。我会检查并确定阅读
    • 太好了,祝您编码愉快。
    【解决方案2】:

    将您的self.tableView.reloadData() 替换为viewWillAppearviewDidLoad 只在 viewController 创建后被调用一次,而viewWillAppear 是在每次它即将出现在屏幕上时被调用。

    另外,不要使用推送从 VC3 返回到 VC2。你应该弹出当前的 viewController。

    self.navigationController?.popViewController(animated: true)
    

    【讨论】:

    • 好答案。和我的回答一样。 +1 兄弟。你对popViewController的观察非常好。
    • 试过了。你是对的。而已。非常感谢
    【解决方案3】:

    而不是再次从ViewController3 推送ViewController2,您需要创建一个委托并在您的ViewController2 中实现该委托,现在在viewController3 中创建该委托的实例,并在您从@ 移动时设置该委托987654325@ 至ViewController3。现在,当您更新或删除 ViewController2 的数据时,只需使用该委托从 ViewController2 调用方法,然后在该方法中更新您的 DataSource 并重新加载 tableView

    【讨论】:

      【解决方案4】:

      N.,

      通常,当不同的视图控制器嵌入到导航控制器中时,您向上推堆栈并返回您从堆栈中弹出。据我了解您的故事,您似乎只是在堆栈上推送新的视图控制器。

      您的第一个视图控制器是 VC1。您按下一个按钮,然后将新的视图控制器推入堆栈,VC2。导航控制器现在在堆栈 VC1 和 VC2 上有 2 个视图控制器。然后您在 VC2 的表格视图中选择一个单元格,它会将您带到 VC3。

      导航控制器现在在堆栈 VC1、VC2 和 VC3 上拥有 3 个视图控制器。现在您删除一个单元格,然后将一个新的视图控制器推送到堆栈上,这又是一个 VC2,但是是一个新的。导航控制器现在在堆栈 VC1、VC2、VC3 和另一个 VC2 实例上有四个视图控制器。

      我假设您有一个模型对象,其中包含 VC2 和 VC3 的表视图中的数据。当您删除单元格时,您应该删除模型对象中的单元格,而不是将新的 VC2 压入堆栈,而是关闭 VC3。您可以使用 VC2 中的 @IBAction 来执行此操作,删除按钮连接到该 @IBAction。然后它从堆栈中弹出 VC3,然后您在 IBAction 方法中返回 VC2,您已将删除按钮链接到该方法。导航控制器在堆栈上再次只有 2 个视图控制器,VC1 和 VC2。

      在该 IBAction 方法中,您可以重新加载表格视图,表格视图将调用数据源方法

      tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
      

      此方法将查看您的模型对象,但找不到已删除的数据,并且您的单元格消失了。

      当您按下后退按钮时,导航控制器会从堆栈中推送 VC2,并且只剩下一个视图控制器 VC1。您将返回您的页面。

      希望这会有所帮助。

      【讨论】:

      • 感谢您向我解释。我可以看到出了什么问题。再次感谢
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-18
      • 2023-03-27
      • 1970-01-01
      相关资源
      最近更新 更多