斯威夫特 3:popToViewController 不工作

Posted

技术标签:

【中文标题】斯威夫特 3:popToViewController 不工作【英文标题】:Swift 3: popToViewController not working 【发布时间】:2017-04-21 09:35:58 【问题描述】:

在我的应用程序中,我有三个表视图控制器,然后可能有许多 UIViewController,如果用户在任何时候按下回,每个控制器都必须返回到第一个表视图控制器。我不希望用户不得不返回可能数百页。这就是我有趣的判断用户是否按下了后退按钮并且它可以打印消息

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

我已经搜索过,到目前为止没有一个解决方案有效。

【问题讨论】:

【参考方案1】:

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)

【讨论】:

哦,不知道。有用!但是有一点延迟。它首先加载上一个视图,然后跳转到我想要的视图。有什么办法解决这个问题? @Filipe 将动画设置为 false,因为您在 ``viewWillDisappear` 中调用它 @Filipe 您的上一个正在显示,因为您已将此代码放在 viewWillDisappear 中,而不是您需要将自定义后退栏按钮设置为 leftBarButtonItem 并通过该方法的操作添加此代码 @NiravD 如何在使用 popToViewController 时传递黑白视图控制器的值??? @ArgaPK 处理这种情况的最佳方法是将协议/委托与某些 Utill 类的共享实例一起使用。【参考方案2】:

试试这个:

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)
                            
                        

【讨论】:

也可以,但是我遇到了与其他解决方案相同的问题,即在转到所需的视图之前仍会显示先前的视图。有什么办法吗? 上一个视图?【参考方案3】:

如果您在回调中,尤其是异步网络回调中,您可能不在主线程上。如果这是你的问题,解决方案是:

DispatchQueue.main.async 
    self.navigationController?.popToViewController(startvc, animated: true)

系统调用viewWillDisappear()总是在主线程上调用。

【讨论】:

以上是关于斯威夫特 3:popToViewController 不工作的主要内容,如果未能解决你的问题,请参考以下文章

平移图像后面的黑色背景。斯威夫特 3

为啥导航栏中没有显示标题?斯威夫特 3

UIImageView 周围的填充。斯威夫特 3

斯威夫特 3 |核心数据 |自定义实体

斯威夫特 3 NSMuttableArray

tableView Cell 不显示数据,这是啥问题? (斯威夫特 3)