| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139 |
- //
- // UIViewController+Extension.swift
- // QuickSearchLocation
- //
- // Created by mac on 2024/4/10.
- //
- import UIKit
- // MARK: - 一、基本的扩展
- public extension UIViewController {
-
- // MARK: 1.1、pop回上一个界面
- /// pop回上一个界面
- func popToPreviousVC() {
- guard let nav = self.navigationController else { return }
- if let index = nav.viewControllers.firstIndex(of: self), index > 0 {
- let vc = nav.viewControllers[index - 1]
- nav.popToViewController(vc, animated: true)
- }
- }
-
- // MARK: 1.2、获取push进来的 VC
- /// 获取push进来的 VC
- /// - Returns: push进来的 VC
- func getPreviousNavVC() -> UIViewController? {
- guard let nav = self.navigationController else { return nil }
- if nav.viewControllers.count <= 1 {
- return nil
- }
- if let index = nav.viewControllers.firstIndex(of: self), index > 0 {
- let vc = nav.viewControllers[index - 1]
- return vc
- }
- return nil
- }
-
- // MARK: 1.3、获取顶部控制器(类方法)
- /// 获取顶部控制器
- /// - Returns: VC
- static func topViewController() -> UIViewController? {
- guard let window = UIApplication.shared.windows.filter({$0.isKeyWindow}).first, let rootVC = window.rootViewController else {
- return nil
- }
- return top(rootVC: rootVC)
- }
-
- // MARK: 1.4、获取顶部控制器(实例方法)
- /// 获取顶部控制器
- /// - Returns: VC
- func topViewController() -> UIViewController? {
- guard let window = UIApplication.shared.windows.filter({$0.isKeyWindow}).first, let rootVC = window.rootViewController else {
- return nil
- }
- return Self.top(rootVC: rootVC)
- }
-
- private static func top(rootVC: UIViewController?) -> UIViewController? {
- if let presentedVC = rootVC?.presentedViewController {
- return top(rootVC: presentedVC)
- }
- if let nav = rootVC as? UINavigationController,
- let lastVC = nav.viewControllers.last {
- return top(rootVC: lastVC)
- }
- if let tab = rootVC as? UITabBarController,
- let selectedVC = tab.selectedViewController {
- return top(rootVC: selectedVC)
- }
- return rootVC
- }
-
- // MARK: 1.5、是否正在展示
- /// 是否正在展示
- var isCurrentVC: Bool {
- return isViewLoaded == true && (view!.window != nil)
- }
-
- // MARK: 1.6、关闭当前的控制器
- /// 关闭当前的控制器
- func closeCurrentVC() {
- guard let nav = self.navigationController else {
- dismiss(animated: true, completion: nil)
- return
- }
- if nav.viewControllers.count > 1 {
- nav.popViewController(animated: true)
- } else if let _ = nav.presentingViewController {
- nav.dismiss(animated: true, completion: nil)
- }
- }
-
- //MARK: 1.7、dismiss到某个vc
- /// dismiss到某个vc
- /// - Parameters:
- /// - vc: vc
- /// - animated: 是否需要动画
- @discardableResult
- func dismiss(vc: AnyClass, animated: Bool) -> Bool {
- guard let targetPresentingVC = findPresentingViewController(fromVc: self, toVc: vc) else { return false }
- targetPresentingVC.dismiss(animated: animated)
- return true
- }
-
- //MARK: 寻找到对应的presentingViewController
- /// 寻找到对应的presentingViewController
- /// - Parameters:
- /// - fromVc: 当前vc
- /// - toVc: 目标vc
- /// - Returns: 目标presentingViewController
- private func findPresentingViewController(fromVc: UIViewController, toVc: AnyClass) -> UIViewController? {
- // 判断是否存在对应的presentingViewController
- guard let vc = fromVc.presentingViewController else { return nil }
- // 判断是否是目标vc
- if (vc.isMember(of: toVc)) {
- // 寻找到对应的presentingViewController
- return vc
- } else {
- return findPresentingViewController(fromVc: vc, toVc: toVc)
- }
- }
-
- func pushVC(vc: UIViewController ) {
-
- if vc.isKind(of: UIViewController.self) == false {
- return
- }
-
- if self.navigationController == nil {
- return
- }
-
- if vc.hidesBottomBarWhenPushed == false {
- vc.hidesBottomBarWhenPushed = true
- }
-
- self.navigationController?.pushViewController(vc, animated: true)
- }
- }
|