【问题标题】:Pop 2 view controllers in Nav Controller in Swift在 Swift 中的 Nav Controller 中弹出 2 个视图控制器
【发布时间】:2014-10-01 01:13:36
【问题描述】:

我找到了许多使用 Objective-C 在UINavigationController 中弹出 2 UIViewControllers 的方法,但是当我尝试将其切换到 Swift 时,它似乎不起作用。

弹回UIViewController 的最佳方法是什么? 任何指导将不胜感激 谢谢

【问题讨论】:

  • 与 ObjC 中的非常相似:复制UINavigationControllerviewControllers 数组,从该数组中删除最后两个元素并将viewControllers 设置为修改后的数组。还有一个 setViewControllers(_:animated:) 包含弹出动画。
  • 或者您可以在viewControllers 数组中找到倒数第二个视图控制器,然后使用popToViewController 来避免覆盖整个视图控制器堆栈。
  • 你可以按他的班级弹出到控制器stackoverflow.com/questions/30003814/…

标签: ios uinavigationcontroller


【解决方案1】:

扩展我的评论,在 viewControllers 数组中找到倒数第二个视图控制器,然后使用 popToViewController 来避免覆盖整个视图控制器堆栈。

示例(假设导航控制器有多个视图控制器):

func backTwo() {
    let viewControllers: [UIViewController] = self.navigationController!.viewControllers as [UIViewController]
    self.navigationController!.popToViewController(viewControllers[viewControllers.count - 3], animated: true)
}

Objective-C

NSArray *viewControllers = [self.navigationController viewControllers];
[self.navigationController popToViewController:viewControllers[viewControllers.count - 3] animated:YES];

【讨论】:

  • 这非常有效,谢谢!后续问题:当它确实弹出到正确的视图控制器时,它首先将横向视图变为纵向,然后弹出。有没有办法让它在弹出之前不旋转横向视图?
  • 哇,谢谢 Aaron,这非常有效!奇怪的是,我不得不把viewControllers.count - 3 放回两步,但现在工作得很好!
  • viewControllers 数组也包含当前的 UIViewController,因此您必须使用 viewControllers.count - 3
【解决方案2】:

我写了一个 UIViewController 扩展(Swift 3+ 就绪)

你可以这样使用:

/// pop back n viewcontroller
func popBack(_ nb: Int) {
    if let viewControllers: [UIViewController] = self.navigationController?.viewControllers {
        guard viewControllers.count < nb else {
            self.navigationController?.popToViewController(viewControllers[viewControllers.count - nb], animated: true)
            return
        }
    }
}

用法:

self.popBack(3)

奖励关闭到特定的视图控制器

/// pop back to specific viewcontroller
func popBack<T: UIViewController>(toControllerType: T.Type) {
    if var viewControllers: [UIViewController] = self.navigationController?.viewControllers {
        viewControllers = viewControllers.reversed()
        for currentViewController in viewControllers {
            if currentViewController .isKind(of: toControllerType) {
                self.navigationController?.popToViewController(currentViewController, animated: true)
                break
            }
        }
    }
}

用法:

self.popBack(toControllerType: MyViewController.self)

【讨论】:

    【解决方案3】:

    user5320485 在 swift3 中回答

    let viewControllers = self.navigationController!.viewControllers as [UIViewController];
    for aViewController:UIViewController in viewControllers {
        if aViewController.isKind(of: AdCreateViewController.self) {
            _ = self.navigationController?.popToViewController(aViewController, animated: true)
        }
    }
    

    【讨论】:

      【解决方案4】:

      您可以在(swift 2.0)中动态弹出多个视图控制器

      let allViewController: [UIViewController] = self.navigationController!.viewControllers as [UIViewController];
      
                              for aviewcontroller : UIViewController in allViewController
                              {
                                  if aviewcontroller .isKindOfClass(YourDestinationViewControllerName)
                                  {
                                   self.navigationController?.popToViewController(aviewcontroller, animated: true)
                                  }
                              }
      

      【讨论】:

        【解决方案5】:

        @Maximelc 答案的 Swift 4 UINavigationController 扩展版本:

        extension UINavigationController {
        
            func popBack(_ nb: Int) {
                let viewControllers: [UIViewController] = self.viewControllers
                guard viewControllers.count < nb else {
                    self.popToViewController(viewControllers[viewControllers.count - nb], animated: true)
                    return
                }
            }
        
            /// pop back to specific viewcontroller
            func popBack<T: UIViewController>(toControllerType: T.Type) {
                var viewControllers: [UIViewController] = self.viewControllers
                viewControllers = viewControllers.reversed()
                for currentViewController in viewControllers {
                    if currentViewController .isKind(of: toControllerType) {
                        self.popToViewController(currentViewController, animated: true)
                        break
                    }
                }
            }
        
         }
        

        【讨论】:

        • 用法:self.navigationController?.popBack(1) self.navigationController?.popBack(toControllerType: YourViewController.self)
        【解决方案6】:

        这是另一个稍微“防呆”的版本:

        extension UINavigationController {
            func popBack(_ count: Int) {
                guard count > 0 else {
                    return assertionFailure("Count can not be a negative value.")
                }
                let index = viewControllers.count - count - 1
                guard index > 0 else {
                    return assertionFailure("Not enough View Controllers on the navigation stack.")
                }
                popToViewController(viewControllers[index], animated: true)
            }
        }
        

        【讨论】:

          【解决方案7】:

          如果您想在特定的视图控制器上弹出,您可以通过在示例代码中将 DestinationViewController 替换为您的视图控制器来搜索该视图控制器。

          func moveToDestinationViewController() {
              let viewController = self.navigationController?.viewControllers.first { $0 is DestinationViewController }
              guard let destinationVC = viewController else { return }
              self.navigationController?.popToViewController(destinationVC, animated: true)
          }
          

          【讨论】:

            【解决方案8】:

            我做了一个帮手让它变得简单:

            import Foundation
            import UIKit
            
            class NavigationHelper {
            
                static func back(number: Int, from viewControlller : UIViewController) {
                    let viewsBack = number + 1
                    let viewControllers: [UIViewController] = viewControlller.navigationController!.viewControllers as [UIViewController]
                    viewControlller.navigationController!.popToViewController(viewControllers[viewControllers.count - viewsBack], animated: true)
                }
            
                static func back(number: Int, from viewControlller: UITableViewController) {
                    let viewsBack = number + 1
                    let viewControllers: [UIViewController] = viewControlller.navigationController!.viewControllers as [UIViewController]
                    viewControlller.navigationController!.popToViewController(viewControllers[viewControllers.count - viewsBack], animated: true)
                }
            }
            

            例如,在您的ViewController 中,您可以使用NavigationHelper.back(number: 1, from: self)

            【讨论】:

              【解决方案9】:
               let allViewControllers : [UIViewController] = self.navigationController!.viewControllers as [UIViewController]
                      self.navigationController?.popToViewController(allViewControllers[allViewControllers.count-3], animated: true)
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2015-07-12
                • 1970-01-01
                • 1970-01-01
                • 2021-06-24
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多