Swift 3:popToViewController不工作

问题描述:

在我的应用程序中,我有三个表视图控制器,然后可能有很多UIViewControllers,每个UIViewControllers必须返回到第一个表视图控制器,如果用户在任何点回按。我不希望用户必须通过潜在的数百页才能返回。这是我会哄来确定,当用户按下后退按钮和它的作品的消息打印Swift 3:popToViewController不工作

override func viewWillDisappear(_ animated: Bool) { 
    if !movingForward { 
     print("moving back") 
     let startvc = self.storyboard!.instantiateViewController(withIdentifier: "FirstTableViewController") 
     _ = self.navigationController!.popToViewController(startvc, animated: true) 
    } 
} 

我已搜查,到目前为止,没有任何解决方案都工作过。

popToViewController不能以您尝试的方式工作,而是传递FirstTableViewController的全新引用,而不是导航堆栈中的引用。因此,您需要循环访问navigationController?.viewControllers并找到FirstTableViewController,然后使用FirstTableViewController的实例呼叫popToViewController

for vc in (self.navigationController?.viewControllers ?? []) { 
    if vc is FirstTableViewController { 
     _ = self.navigationController?.popToViewController(vc, animated: true) 
     break 
    } 
} 

如果你想要移动到第一屏那么你可能寻找popToRootViewController,而不是popToViewController

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

喔,不知道这一点。有用!但是有一个小的延迟。它首先加载前一个视图,然后跳转到我想要的视图。有任何解决这个问题的方法吗? – Filipe

+0

@Filipe因为你在''viewWillDisappear'里面调用它,动画设置为'false' –

+0

@Filipe你之前显示的是因为你已经把这个代码放在'viewWillDisappear'里面,而不是你需要设置自定义back bar按钮为leftBarButtonItem并用该方法的行动添加此代码 –

试试这个:

let allViewController: [UIViewController] = self.navigationController!.viewControllers as [UIViewController]; 

         for aviewcontroller : UIViewController in allViewController 
         { 
          if aviewcontroller .isKindOfClass(YourDestinationViewControllerName)// change with your class 
          { 
          self.navigationController?.popToViewController(aviewcontroller, animated: true) 
          } 
         } 
+0

也适用,但我遇到了与其他解决方案相同的问题,即前一个视图在显示到所需视图之前仍显示出来。任何修复? – Filipe

+0

哪前一个视图? – KKRocks