ios - 动态呈现 ViewController
问题描述
我正在展示这样的 ViewController
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let ViewController = storyboard.instantiateViewController(withIdentifier: "ViewController") as! ViewController
self.present(ViewController, animated: true, completion: nil)
有没有办法动态传递故事板名称、标识符和视图控制器类型
解决方案
创建新文件 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 案例中应该相同
推荐阅读
- database - 降级后 MongoDB 未启动
- excel - VBA 脚本:代码在调试模式下运行良好,但不是在完全运行模式下
- python - 如何搜索数据框并相应地对每个数据框进行排序?
- azure - 自动将更改从一个 Azure 数据库应用到另一个
- php - 如何合并这个 sql server 查询?
- c# - 简单的查找素数实现
- angular - 如何以角度显示工具提示
- go - 是否可以在没有内置库的情况下编译可以在没有操作系统的机器上运行的 go 代码
- mysql - MYSQL UNIX_TIMESTAMP('02/05/2019') 是不确定的吗?
- c# - Blazor 的“入门”问题