首页 > 解决方案 > 动态呈现 ViewController

问题描述

我正在展示这样的 ViewController

let storyboard = UIStoryboard(name: "Main", bundle: nil)
let ViewController = storyboard.instantiateViewController(withIdentifier:   "ViewController") as! ViewController
self.present(ViewController, animated: true, completion: nil)

有没有办法动态传递故事板名称、标识符和视图控制器类型

标签: iosswiftpresentviewcontroller

解决方案


创建新文件 StoryBoard.swift

let mainBundle = Bundle.main
enum Storyboard: String {
case main = "Main"
case TeamLeader = "TeamLeader"
case Installer = "Installer"
}

extension Storyboard {
var instance: UIViewController {
    return UIStoryboard(name: Storyboard.main.rawValue, bundle: mainBundle).instantiateViewController(withIdentifier: self.rawValue)
}
}

创建新的 ControllerIdentifier.swift 文件

    enum ControllerIdentifier: String {
    case CustomerDetailsVC
    case TeamVC
    case MyProfileVC
    case CancelOrderVcViewController
    case ApprovingCustomerVC
    case RequestsDetailVC
    case NewrequestTL
    case ApprovedTLVC
    case HistoryTLVC
    case SettingsTeamleaderVC
    case HistoryDetailVC
    case ApprovingCustomerFirstVC
    case ApprovingCustomerSecondVC
    case ApprovingCustomerForthVC
    case ApprovingCustomerFifthVC
    case tabbar2
    case ApprovingCustomerThridVC
    case SignatureVC
    case NewRequestsVC
    case tabbar
    case LoginVC
    case CustomerDetailsTL
    case InstallationApprovingFirstVC
    case InstallationApprovingSecondVC
    case InstallerDashBoardVC
    case tabbar3
    case HistoryInstallerVC
    case OrderInProgressVC
    case SettingsInstallerVc
    case RequestDetailInstallerVC
    case HistoryDetailsInstallerVC
    case LocationInstallerVC
    case CancelOrderInstallerVC
    case MyProfileInstallerVC
    
}

extension UIViewController{
    func pushToController(from name : Storyboard, identifier: ControllerIdentifier) {
        DispatchQueue.main.async { [self] in
            let storyboard = UIStoryboard(name: name.rawValue, bundle: nil)
            let vc = storyboard.instantiateViewController(withIdentifier: identifier.rawValue)
            navigationController?.pushViewController(vc,animated: true)
        }
    
    }
    func pushToRoot(from name : Storyboard, identifier: ControllerIdentifier) {
        DispatchQueue.main.async { [self] in
        let storyboard = UIStoryboard(name: name.rawValue, bundle: nil)
        let vc = storyboard.instantiateViewController(withIdentifier: identifier.rawValue)
        let navigationController = UINavigationController(rootViewController: vc)
        navigationController.modalPresentationStyle = .fullScreen
        self.present(navigationController, animated: true, completion: nil)
        }
        
    }
    
    func imageScreenPush(from name : Storyboard, identifier: ControllerIdentifier) {
        DispatchQueue.main.async { [self] in
        let storyboard = UIStoryboard(name: name.rawValue, bundle: nil)
        let vc = storyboard.instantiateViewController(withIdentifier: identifier.rawValue)
        let navigationController = UINavigationController(rootViewController: vc)
            navigationController.modalPresentationStyle = .overCurrentContext
        self.present(navigationController, animated: true, completion: nil)
        }
        
    }
}

如何使用

self.pushToController(from: .Installer, identifier: .tabbar3)

确保 StoryBoard Name 和 UIViewController Identifier 在 Enum 案例中应该相同


推荐阅读