动态呈现 ViewController

Posted

技术标签:

【中文标题】动态呈现 ViewController【英文标题】:Presenting ViewController Dynamically 【发布时间】:2021-07-22 17:49:45 【问题描述】:

我正在展示一个像这样的 ViewController

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

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

【问题讨论】:

***.com/a/58379054/14733292 【参考方案1】:

创建新文件 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)

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

【讨论】:

以上是关于动态呈现 ViewController的主要内容,如果未能解决你的问题,请参考以下文章

动态呈现 ViewController

在模板中呈现动态变化的组件

如何在样式组件中动态呈现伪内容之前

使用行跨度动态呈现数据

在反应原生 Swiper 中动态呈现内容

如何使用动态道具数据动态呈现 vue 组件的新实例