Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 在“展开顺序”、“关闭”和“弹出视图控制器”之间进行选择;“关闭”;当前视图控制器_Ios_Swift - Fatal编程技术网

Ios 在“展开顺序”、“关闭”和“弹出视图控制器”之间进行选择;“关闭”;当前视图控制器

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

对于当前的导航模式

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()
    (不带导航控制器)
  • self.navigationController?.popViewController(动画:true)
    (带导航控制器)
  • 我可以知道,我们如何选择彼此吗?在这种简单的情况下,有什么理由仍然使用“展开”序列吗

    我的理解是,如果我们想从C直接回到A,使用 放松赛格将是最合适的方式

    // Execute this code in C
    self.performSegue(withIdentifier: "unwindToA", sender: self)
    
    我猜你的意思是直接从C到A

    展开顺序:允许您跳转到ViewController层次结构中的特定ViewController(包括前一个),同时销毁中间的另一个视图控制器(显然假设中间的ViewController可以解除分配),因此在您从C跳转到a时,segue完成后,不仅C,B也将被解除分配

    优点:

  • 提供了一种干净整洁的方式,可以轻松跳转到层次结构中的任何特定ViewConroller

  • 您可以使用
    prepareForSegue
    获得要解除的视图控制器,并且可以避免在源视图控制器和目标视图控制器之间写入协议/委托或闭包(如果其间有多个视图控制器,这可能会非常麻烦)

  • 缺点:

  • 源和目标ViewController之间的关系过于紧密,并且随着项目规模的增长和ViewController之间的视图控制器和流数量的增加,管理起来会很麻烦
  • 在我参与的几乎所有现实世界的应用程序中,我意识到当ViewController之间的复杂流增加时,Segue通常变得不可用

    self.disclose()

    取消由它(self)呈现的
    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)
  • 如果您有一个复杂的层次结构,其中推送和呈现了多个VCs,则您可能必须使用
    dislose
    popViewController
    的组合才能到达您感兴趣的特定视图控制器

  • 虽然,使用unwind segue可以轻松实现所有3点,但您可以使用unwind segue,如果您的用例没有那么复杂,并且您知道ViewController层次结构可能会有有限的组合,请选择unwind segue

  • 我的理解是,如果我们想从C直接回到A,使用 放松赛格将是最合适的方式

    // Execute this code in C
    self.performSegue(withIdentifier: "unwindToA", sender: self)
    
    我猜你的意思是直接从C到A

    展开顺序:允许您跳转到ViewController层次结构中的特定ViewController(包括前一个),同时销毁中间的另一个视图控制器(显然假设中间的ViewController可以解除分配),因此在您从C跳转到a时,segue完成后,不仅C,B也将被解除分配

    优点:

  • 提供了一种干净整洁的方式,可以轻松跳转到层次结构中的任何特定ViewConroller

  • if let vc = self.navigationController?.viewControllers.last(where: { $0.isKind(of: DestinationViewController.self) }) {
        popToViewController(vc, animated: true)
    }