返回上一个 ViewController 不适用于 Swift 中的多个视图控制器

Posted

技术标签:

【中文标题】返回上一个 ViewController 不适用于 Swift 中的多个视图控制器【英文标题】:Go back to previous ViewController not working for multiple view controllers in Swift 【发布时间】:2017-08-23 11:22:29 【问题描述】:

如何以编程方式返回到先前的视图控制器?我找到了这个答案,但是有一个例子演示了如果我们有导航堆栈如何返回:

self.dismiss(animated: true, completion: nil)

如果我的控制器队列基于导航控制器,那没关系。 当我要转到下一个视图控制器时,有多个 viewController 都与 navigationView 控制器连接,并且回退工作正常,但是从下一个到下一个,我回退并卡在一个循环中意味着我卡在第二个和第三个视图控制器之间不去到第一个视图控制器。

【问题讨论】:

你需要使用这个developer.apple.com/documentation/uikit/uinavigationcontroller/… 你能告诉我如何使用它吗?? popViewController 方法的工作原理是将您从导航控制器维护的所有视图控制器堆栈中带回一个 VC。假设:您在应用 A、B、C 中有 3 个 VC。 A 去 B 去 C。现在你需要调用 self.navigationcontroller.popviewcontrolleranimated(animated: true) 返回一个 VC。从 C 到 B,从 B 到 A。 请分享您的代码,让其他人了解您面临的问题。 @praveensrivastava - 你的问题不太清楚......你是否使用UINavigationController 【参考方案1】:

试试这个:- //用于移动到上一个屏幕

self.navigationController?.popViewController(animated: true)

//用于移动到你的根视图控制器!这将清除您的//导航堆栈。

 self.navigationController?.popToRootViewController(animated: true)

//移动到特定的视图控制器 eg:- TargetVC

for obj in (self.navigationController?.viewControllers)! 
        if obj is TargetVC 
 self.navigationController?.popToViewController(obj, animated: true)
            break
        
    

【讨论】:

【参考方案2】:

不要使用解雇。从A to B 使用navigationcontroller.pushviewcontroller,对于B to C,使用presentviewcontroller。 然后在C controller 的返回按钮上使用dismissViewcontroller,在B controller 的返回按钮上使用popViewController

【讨论】:

【参考方案3】:

在 swift 3 中,在按钮操作中尝试此代码

@IBAction func btnBackClick(_ sender: UIButton) 
       _ = navigationController?.popViewController(animated: true) 
    

【讨论】:

【参考方案4】:

navigation stack (A -> B -> C),

    要将1 controller 向后移动(B ,请使用

    self.navigationController?.popViewController(animated: true)
    

    要移动到root view controller (A ,请使用

    self.navigationController?.popToRootViewController(animated: true)
    

【讨论】:

实际上目前我正在使用 self.dismiss(animated: true, completion: nil) 并且它从 B 到 A 工作正常但是当执行 c 到 b 然后 b 到 a 时将我送回c.我不知道为什么。 您要检查什么?请注明清楚。 当您将控制器呈现在其他控制器之上时,Dismiss 起作用。当您在导航堆栈中推送控制器时,Pop 会起作用。两者是不同的。你想用哪一个?我认为对于您的用例 Push/Pop 可以正常工作。 导航堆栈仅适用于导航控制器。它维护着所有被推送的控制器的堆栈。 我不明白你想表达什么。【参考方案5】:

弹出 PreviousViewcontroller

  self.navigationController?.popViewController(animated: true)

弹出到根视图控制器

  self.navigationController?.popToRootViewController(animated: true)

弹出到特定的视图控制器

 let viewControllers: [UIViewController] = self.navigationController!.viewControllers ;
 for vc in viewControllers
  
    if vc.isKind(of:YourViewController)
     
      self.navigationController!.popToViewController(vc, animated: true)
   break;
    
    
  

【讨论】:

【参考方案6】:

对于 Swift 3.0 你可以使用这个:-

如果你想支持你的 rootviewcontroller 使用这个

        _ = self.navigationController?.popToRootViewController(animated: true)

或者如果你想返回另一个添加到 Stack 上的视图控制器:-

 for obj in (self.navigationController?.viewControllers)! 
        if obj is TargetVC 
        _ =    self.navigationController?.popToViewController(obj, animated: true)
            break
        
    

【讨论】:

以上是关于返回上一个 ViewController 不适用于 Swift 中的多个视图控制器的主要内容,如果未能解决你的问题,请参考以下文章

(目标:对象)不适用于从 viewController 外部设置 UIButton

Swift 3 UIStatusBarStyle 不适用于 UINavigationController 中的单独 ViewController

在 UINavigationController 中,按钮不适用于 pushViewController

自定义缩放过渡不适用于模态演示

在英文整数上显示每个数字的程序不适用于以“0”开头的整数

动画视图的子视图不适用于 CAGradientLayer [关闭]