如何解决动态呈现 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,bundle: nil)
let vc = storyboard.instantiateViewController(withIdentifier: identifier.rawValue)
let navigationController = UINavigationController(rootViewController: vc)
navigationController.modalPresentationStyle = .overCurrentContext
self.present(navigationController,completion: nil)
}
}
}
如何使用
self.pushToController(from: .Installer,identifier: .tabbar3)
确保在 Enum 情况下 StoryBoard Name 和 UIViewController Identifier 应该相同
,故事板扩展:
extension UIStoryboard {
enum Name: String {
case main = "Main"
case home = "Home"
}
static func instantiateViewController<T>(storyboard name: Name = .main,ofType type: T.Type) -> T? {
return UIStoryboard(name: name.rawValue,bundle: nil).instantiateViewController(withIdentifier: String(describing: type.self)) as? T
}
}
用法:(确保 Storyboard Id 和 class-name 相同。)
if let vc = UIStoryboard.instantiateViewController(storyboard: .home,ofType: HomeVC.self) {
self.present(vc,completion: nil)
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。