【问题标题】:viewWillAppear not always executed when viewController is presentviewWillAppear 在 vi​​ewController 存在时并不总是执行
【发布时间】:2020-10-21 05:02:36
【问题描述】:

我正在开发一个 iOS 应用程序。

有一个 viewController A 以编程方式对细节 viewController D 执行 segue。

在该详细视图控制器 D 上,用户可能会更改一些信息,当单击返回按钮到视图控制器 A 时应更新这些信息。

在 viewController A 我已经包含了这个功能:

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    determineMyCurrentLocation()
    print("reloading data")

        downloadJSONFavoritos {
            print("reloading viewwillappear")
        
        self.collectionViewFavoritos.reloadData()
    }
}

我的问题是,当返回 viewController A 时,并不总是调用这个函数,然后 A 中的信息没有按应有的更新。

【问题讨论】:

  • 您可以拥有closure,当用户对viewController D 执行操作时,closure 将触发您的更新逻辑
  • @vpoltave,请告诉我你告诉我的闭包是什么
  • 您误解了 viewController 的生命周期。 ViewWillAppear 在创建和显示“A”时被调用。当您转到“D”时,“A”不会被破坏,因此不会再次调用该方法。这不是将数据传回 viewController 的方式。
  • 如果视图控制器将视图控制器 D 呈现为全屏模式或将其推送到导航堆栈上,则当视图控制器 D 关闭时,应调用视图控制器 A 的 viewWillAppear(_:)。也就是说,这不是传回信息的好方法。您应该使用委托设计模式,或者将闭包传递给视图控制器 D,当新数据可用时它将调用该闭包。在 viewWillAppear 中盲目触发 JSON 的下载并不是一个好办法。

标签: ios swift


【解决方案1】:

我将创建简单的示例,请根据您的需要进行调整。

ViewController A:

class ViewControllerA: UIViewController {

    func someMethod() {
        let viewControllerD = // creation and displaying logic of your viewController D
        viewControllerD.updateCompletionHandler = { [unowned self] in 
            /// Any updates goes here ...
        }
    }
}

视图控制器 D:

class ViewControllerD: UIViewController {

   var updateCompletionHandler: (() -> Void)?

   /// Just example
   @IBAction func triggerUpdateButton(_ sender: UIButton) {
       /// Call it, in place where user make changes
       updateCompletionHandler?()   
   }
}

如果您有任何问题,请在 cmets 中告诉我。

【讨论】:

  • 谢谢,但我不知道应该在 A 中包含的那段代码。
  • @mvasco 有一个 viewController A 以编程方式执行 segue - 这里。如果在此之后您仍然有问题,请在您创建ViewController D 的位置添加代码到您的问题。
  • viewController D 是这样调用的:performSegue(withIdentifier: "mis_dispositivos_a_detalle", sender: nil)
  • @mvasco 然后你需要把它改成这样:stackoverflow.com/a/53267661/6057764,应该不会造成任何问题。
  • 我没有在您建议的链接中找到我的问题的解决方案
猜你喜欢
  • 1970-01-01
  • 2017-07-16
  • 1970-01-01
  • 2014-03-25
  • 1970-01-01
  • 1970-01-01
  • 2015-12-19
  • 2015-11-05
  • 1970-01-01
相关资源
最近更新 更多