我有一个 View Controller A,在它上面,我以模态方式呈现了一个 View Controller B,现在,B 将导航到 C,然后是 D,然后是 E...当我完成 E 上的数据选择后,我应该关闭 View Controller 堆栈(B、C、D、E)并将数据传递回 A。
目前,我所做的是,我使用chanin委托(delegate)...我将B设置为A的委托(delegate),然后当我们导航时,我将C设置为B的委托(delegate),然后将D设置为C的委托(delegate),然后D因此,当我们完成在 ViewController E 上选择一个项目时,我调用委托(delegate)方法,该方法将触发 A 关闭整个 viewControllers 堆栈。
但是我觉得这个方法很麻烦..
我也用过通知的方式,但是觉得很不优雅..
所以,我想知道是否有更好的方法将数据从 E 传回 A?
谢谢
最佳答案
好吧,我一直觉得这很麻烦,因为我一直讨厌委托(delegate)和通知中心的方法。
嗯,在我发布问题后,我想到了一个我个人喜欢的解决方案。
这里是为那些正在寻找替代方案的人提供的实现。
我所做的就是对 NavigationController 进行子类化。
Class CustomNavigationController : UINavigationController {
var onFinishedModelPresentation : (()-> Void)
}
然后在任何模态呈现 navigationController 之前,您所要做的就是这个
let newNavigationController = CustomNavigationController()
newNavigationController.onFinishedVeriticalFlow = {
(you can do whatever you want In this call back closure)
self.navigationController.dismiss()
}
self.navigationController.present(newNavigationController)
然后对于viewController B、C、D、E,如果它们中的任何一个有一个函数来消除整个viewControllers堆栈......你所要做的就是调用
self.navigationController.onFinishedVerticalFlow?()
我选择这种方法而不是委托(delegate)和通知的原因是。
如果我们使用委托(delegate),在我提到的情况下,将需要大量的委托(delegate)链接,这会使代码变得非常困惑并且难以跟踪。
如果我们使用通知,我们必须在每个 View Controller 上手动设置通知,并处理删除每个 View Controller 上的通知。
另外,我不喜欢通知的原因是它看起来非常脱钩......就像你知道这个特定的通知会收到通知,但你不知道它可能来自谁......如果你删除通知,很难找出是否仍然有任何 notification.post 向该特定通知接收器发送通知。您必须手动搜索代码并将其删除。
但是当然,其中大部分是我自己提出这种方法的原因。我只是希望它可以帮助那些正在寻找替代方案的人。
干杯。
关于ios - 将数据传递回presentingViewController 的好方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46999739/