【问题标题】:iOS get notified in parent viewcontroller when presented viewcontroller is dimissed当呈现的视图控制器被解除时,iOS 在父视图控制器中得到通知
【发布时间】:2021-11-12 05:15:04
【问题描述】:

我有一个视图控制器,它呈现另一个视图控制器,在呈现的视图控制器中,用户做出选择,这将导致许多其他通知被推送,但是当我们关闭演示视图控制器时,我希望原始父视图控制器被通知为 viewwillappear没有开火。

【问题讨论】:

  • 我希望 viewWillAppear 在孩子被解雇时在父视图控制器中被调用。 (viewDidLoad 不会再次被调用,但是 viewWillAppear 应该在每次视图控制器即将被移到最前面时被调用。)
  • @DuncanC 这取决于模态转换样式:如果呈现的视图是“全屏”,则将调用 viewWillAppear(更准确地说:可能 i> 被调用)。如果它部分覆盖了呈现视图控制器的视图,则不会调用 viewWillAppear - 因为它已经存在并且没有出现。
  • @CouchDeveloper 好点。发表评论后,我想到了这一点。
  • 就像你说的,它是模态的,viewwillappear 不是 gettign 调用的

标签: ios swift uipresentationcontroller dismissviewcontroller


【解决方案1】:

您可以在孩子即将关闭时发布通知,并在父视图控制器中观察通知。

在父视图控制器中

NotificationCenter.default.addObserver(self, selector: #selector(methodtobecalled(_:)), name: "childdismissed", object: nil)

 @objc func methodtobecalled(_: Notification) {
        
    }

在子视图控制器中,当您选择关闭时,发送通知

NotificationCenter.default.post(name: "childdismissed", object: nil, userInfo: nil)

在呈现的视图控制器中采用 UIAdaptivePresentationControllerDelegate

在下面添加委托方法

func presentationControllerShouldDismiss(_ presentationController: UIPresentationController) -> Bool {
        return false
    }

func presentationControllerDidAttemptToDismiss(_ presentationController: UIPresentationController) {
    dismiss(animated: true, completion: nil)
   // Post the notification here

}

【讨论】:

  • 我正在寻找通知以外的解决方案。谢谢
  • 就像提到的那样,使用基于块的视图控制器?或者你可以选择基于委托的
  • 有时演示文稿会被简单地拉下来,所以在这种情况下......你无法调用通知
  • 我已经更新了答案
【解决方案2】:

您可以向子控制器添加块处理程序,以通知父控制器用户选择:

struct Choice {
  // whatever object that represents the user choice
}

class ChildController: UIViewController {

  var completionHandler: ((ChildController, Choice) -> Void)?

  func finishPresentation(with choice: Choice) {
     // Suppose this function is called when user picks something in the user interface
     completionHandler?(self, choice)
  }

}

然后在父控制器中,分配completionHandler 以获得用户选择的通知。

class ParentController: UIViewController {
  func presentChild() {
     let controller = ChildController()

     controller.completionHandler = { child, choice
        child.dismiss(animated: true) {
          // do something with the user choice
        }
     }

     present(controller, animated: true)
  }
}

【讨论】:

  • 我正在使用 MVVM 架构,通过处理程序将数据从一个视图模型传递到另一个视图模型到另一个视图模型有点复杂......无论如何我可以通过一些视图控制器了解这一点父视图控制器中的生命周期方法?
  • @DCT 不是真的,尽管有办法在呈现视图控制器上解决这个问题。那么问题是,您只知道 UIViewController 即将被解雇。但您实际上需要子级传递回父级的 data。本的解决方案是完美的。 ;)
  • @DCT 问题中没有提到这一点。我认为是否使用模型并不重要,您应该有某种反向通道来在控制器之间传递数据。
猜你喜欢
  • 1970-01-01
  • 2015-04-10
  • 2012-03-16
  • 1970-01-01
  • 2015-12-27
  • 1970-01-01
  • 2012-12-03
  • 1970-01-01
  • 2019-10-04
相关资源
最近更新 更多