我有一个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?
由于
答案 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?()
我选择这种方法而不是委托和通知的原因是因为。
如果我们使用委托,在我提到的情况下,将需要很多代理链接,它会使代码非常混乱并且难以跟踪。
如果我们使用通知,我们必须在每个视图控制器上手动设置通知,并处理删除每个viewController上的通知。
此外,我不喜欢通知的原因是它似乎非常分离...就像你知道这个特定的通知会收到通知,但你不知道它是谁...如果你删除通知,很难确定是否还有任何notification.post发送通知给这个特定的通知接收者。你会手动搜索代码并删除它们。
但是,当然,大多数这些都是我提出这种方法的原因。我只是希望它可以帮助那些正在寻找替代方案的人。
干杯。
答案 1 :(得分:-1)
就个人而言,我会使用通知。它们很容易设置(两个命令)。
设置过程旁边的通知好处是,我不知道你是否需要它,但如果你也可以将数据从让我们说VC C传递到A,而不仅仅是E到A.
由于它只是两个命令,你可以在网上找到很多教程。