将数据传递回presetingViewController的好方法

时间:2017-10-29 11:42:22

标签: ios swift

我有一个viewController A,在它上面,我模态地呈现了一个viewcontroller B,现在,B将导航到C,然后是D,然后是E ......当我完成选择E上的数据时,我就是应该关闭一堆视图控制器(B,C,D,E)并将数据传回给A.

目前,我所做的是,我使用chanin委托...我将B设置为A的委托,然后当我们导航时,我将C设置为B的委托,然后D作为C的委托,然后D作为E的委托。所以当我们完成在ViewController E上选择一个项目时,我调用委托方法,它将触发A来解除整个viewControllers堆栈。

但我发现这种方法非常麻烦......

我也使用了通知方法,但发现它非常不优雅..

所以,我想知道,如果有更好的方法将数据从E传递回A?

由于

2 个答案:

答案 0 :(得分:0)

好的,我总是发现这是一个痛苦的屁股,因为我一直讨厌代表和通知中心的方法。

嗯,在我发布问题后,我想到了一个我个人喜欢的解决方案。

所以这里是那些正在寻找替代方案的人的实现。

我所做的是我将NavigationController子类化。

    Class CustomNavigationController : UINavigationController {
       var onFinishedModelPresentation : (()-> Void)
}

然后在任何一个modal呈现navigationController之前,你所做的就是这个

    let newNavigationController = CustomNavigationController()
    newNavigationController.onFinishedVeriticalFlow = {
     (you can do whatever you want In this call back closure)
     self.navigationController.dismiss()
}
   self.navigationController.present(newNavigationController)

然后对于viewControllers B,C,D,E,如果它们中的任何一个具有解除整个viewControllers堆栈的功能......你所要做的就是调用

self.navigationController.onFinishedVerticalFlow?()

我选择这种方法而不是委托和通知的原因是因为。

  1. 如果我们使用委托,在我提到的情况下,将需要很多代理链接,它会使代码非常混乱并且难以跟踪。

  2. 如果我们使用通知,我们必须在每个视图控制器上手动设置通知,并处理删除每个viewController上的通知。

  3. 此外,我不喜欢通知的原因是它似乎非常分离...就像你知道这个特定的通知会收到通知,但你不知道它是谁...如果你删除通知,很难确定是否还有任何notification.post发送通知给这个特定的通知接收者。你会手动搜索代码并删除它们。

    但是,当然,大多数这些都是我提出这种方法的原因。我只是希望它可以帮助那些正在寻找替代方案的人。

    干杯。

答案 1 :(得分:-1)

就个人而言,我会使用通知。它们很容易设置(两个命令)。

设置过程旁边的通知好处是,我不知道你是否需要它,但如果你也可以将数据从让我们说VC C传递到A,而不仅仅是E到A.

由于它只是两个命令,你可以在网上找到很多教程。