Ios 在“展开顺序”、“关闭”和“弹出视图控制器”之间进行选择;“关闭”;当前视图控制器
对于当前的导航模式 A->B->C 我的理解是,如果我们想从C直接返回A,使用unwind segue将是最合适的方式Ios 在“展开顺序”、“关闭”和“弹出视图控制器”之间进行选择;“关闭”;当前视图控制器,ios,swift,Ios,Swift,对于当前的导航模式 A->B->C 我的理解是,如果我们想从C直接返回A,使用unwind segue将是最合适的方式 // Execute this code in C self.performSegue(withIdentifier: "unwindToA", sender: self) 但是,简单的导航模式怎么样 A->B 总共有3种方法,从B返回A self.performsgue(带有标识符:“unwindToA”,发件人:self) self.disclose
// Execute this code in C
self.performSegue(withIdentifier: "unwindToA", sender: self)
但是,简单的导航模式怎么样 A->B 总共有3种方法,从B返回A
self.performsgue(带有标识符:“unwindToA”,发件人:self)
self.disclose()
(不带导航控制器)self.navigationController?.popViewController(动画:true)
(带导航控制器)// Execute this code in C
self.performSegue(withIdentifier: "unwindToA", sender: self)
我猜你的意思是直接从C到A
展开顺序:允许您跳转到ViewController层次结构中的特定ViewController(包括前一个),同时销毁中间的另一个视图控制器(显然假设中间的ViewController可以解除分配),因此在您从C跳转到a时,segue完成后,不仅C,B也将被解除分配
优点:
prepareForSegue
获得要解除的视图控制器,并且可以避免在源视图控制器和目标视图控制器之间写入协议/委托或闭包(如果其间有多个视图控制器,这可能会非常麻烦)
ViewController
。只有当您的ViewControllers以方式呈现在它上面时,此语句才会起作用,并且有意义。如果presentedViewController
依次在其上方显示多个子视图控制器,则解除父视图控制器也将解除所有子视图控制器
self.navigationController?.popViewController(动画:true)
顾名思义,它会从当前导航堆栈中弹出最顶层的ViewController,只有在嵌入导航控制器并将一个或多个子ViewController推送到其堆栈中时,此语句才会起作用
我不打算比较这3条语句,因为self.dismise()
和self.navigationController?.popViewController(动画:true)
不一样,尽管它们的最终产品正在破坏目标视图控制器,但它们的目的完全不同
一种是取消模式显示的ViewController,其中as pop将弹出推送到导航堆栈的ViewController。它们不能互换使用
此外,您通常使用self.dislose()
和self.navigationController?.popViewController(动画:true)
作为单独语句或有时组合使用,以实现所需的导航,您也可以使用Unwind segue
来实现
在这种简单的情况下,有什么理由仍然使用“展开”序列吗
这取决于您的用例和偏好,我可以肯定地回答的是,在这种简单的情况下,您可以使用unwind segue吗?答案是肯定的,你是否应该使用它取决于
您对源和目标ViewController(A和C)的紧密耦合是否满意?如果明天您必须从ViewController D跳到A怎么办?你可以再拖一段吗?在prepareforsgue
中处理这些条件?您是否愿意用代码重用性和松散耦合来换取实现预期导航的便利性?等等
我可以知道,我们如何选择彼此吗?
您的ViewController上是否有一个或多个ViewController以模式显示?使用self.disclose()
您是否将多个子视图控制器推送到导航堆栈中,并希望将其弹出?使用self.navigationController?.popViewController(动画:true)
dislose
和popViewController
的组合才能到达您感兴趣的特定视图控制器
// Execute this code in C
self.performSegue(withIdentifier: "unwindToA", sender: self)
我猜你的意思是直接从C到A
展开顺序:允许您跳转到ViewController层次结构中的特定ViewController(包括前一个),同时销毁中间的另一个视图控制器(显然假设中间的ViewController可以解除分配),因此在您从C跳转到a时,segue完成后,不仅C,B也将被解除分配
优点:
if let vc = self.navigationController?.viewControllers.last(where: { $0.isKind(of: DestinationViewController.self) }) {
popToViewController(vc, animated: true)
}