ios - 将数据传递回presentingViewController 的好方法

标签 ios swift

我有一个 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)和通知的原因是。

  1. 如果我们使用委托(delegate),在我提到的情况下,将需要大量的委托(delegate)链接,这会使代码变得非常困惑并且难以跟踪。

  2. 如果我们使用通知,我们必须在每个 View Controller 上手动设置通知,并处理删除每个 View Controller 上的通知。

另外,我不喜欢通知的原因是它看起来非常脱钩......就像你知道这个特定的通知会收到通知,但你不知道它可能来自谁......如果你删除通知,很难找出是否仍然有任何 notification.post 向该特定通知接收器发送通知。您必须手动搜索代码并将其删除。

但是当然,其中大部分是我自己提出这种方法的原因。我只是希望它可以帮助那些正在寻找替代方案的人。

干杯。

关于ios - 将数据传递回presentingViewController 的好方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46999739/

相关文章:

ios - apple-itunes-app 元标签测试

ios - 仅在 iOS 9 设备上出现错误

ios - RxSwift 让 Observable 触发一个主题

ios - 如何获取 TextField 输入以及为什么在我滚动时重复输入?

iphone - iPhone 应用程序中的最大线程数是多少?

ios - 安装 pod 失败,尽管它在设置新机器之前有效

ios - 通过 NSDate 和 String 时间的混合对对象的 Swift 数组进行排序

swift - MZCommerceInAppBuy.App BuyInfoDataAccessFailure_message

swift - 在 Swift (tvOS) 中,如何更改 UIButton 的突出显示和焦点颜色?

ios - 在不使用导航 Controller 的情况下将不同的 View 链接到 tableview/viewcontroller