首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >防止iOS应用程序加载默认的Storyboard入口点

防止iOS应用程序加载默认的Storyboard入口点
EN

Stack Overflow用户
提问于 2021-03-01 19:51:26
回答 1查看 416关注 0票数 1

我遵循协调器模式的本教程,到目前为止,我一直在创建协调器,并从app委托运行start()。但是,调用该协调器上的函数不起作用,因为协调器var突然变为零。所显示的初始视图控制器似乎不是来自coordinator.start(),而是来自故事板入口点。我确实禁用了项目目标的主界面中的主界面。

AppDelegate:

代码语言:javascript
复制
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    if let registry = DependencyResolver.shared as? DependencyRegistry {
        DependencyGraph.setup(for: registry)
    }
    
    let navController = UINavigationController()
    coordinator = MainCoordinator(navigationController: navController)
    coordinator?.start()
    
    window = UIWindow(frame: UIScreen.main.bounds)
    window?.rootViewController = navController
    window?.makeKeyAndVisible()
    return true
} 

主要协调员:

代码语言:javascript
复制
class MainCoordinator: Coordinator {

    var navigationController: UINavigationController
    var childCoordinators = [Coordinator]()

    init(navigationController: UINavigationController) {
    self.navigationController = navigationController
    }

    func start() {
        let vc = InitViewController.instantiate()
        vc.coordinator = self. //!!I do hit this breakpoint
        navigationController.pushViewController(vc, animated: false)
    }
}

Init视图控制器(故事板中的首字母,但我用协调器显示它):

代码语言:javascript
复制
class InitViewController: UIViewController, Storyboarded {

    private var cameraViewModel: CameraViewModel!
    weak var coordinator: MainCoordinator?

    @IBAction func openCameraView(_ sender: Any) {
        coordinator?.openCameraView() //!!here coordinator is nil
    }

    override func viewDidLoad() {
        super.viewDidLoad()
    }
}

故事板协议-用于通过id将视图控制器从情节提要中提取出来:

代码语言:javascript
复制
protocol Storyboarded {
    static func instantiate() -> Self
}


extension Storyboarded where Self: UIViewController {
    static func instantiate() -> Self {
        let fullName = NSStringFromClass(self)
        let className = fullName.components(separatedBy: ".")[1]
        let storyboard = UIStoryboard(name: "Main", bundle: Bundle.main)
        let leController = storyboard.instantiateViewController(withIdentifier: className) as! Self
        return leController
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-03-01 20:36:16

问题仅仅是您正在学习的教程对于当前的情况来说太老了。不再有单一的View模板,不再包含窗口。如果您在Xcode 11或Xcode 12中创建一个项目,则该窗口属于场景委托。实现场景委托的willConnect方法来完成应用程序代表在教程中所做的工作,一切都会活跃起来。

此外,防止Main.storyboard试图自动加载的机制也发生了变化;您必须从Info.plist中的应用程序场景说明中删除它(手工编辑--没有简单的接口)。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66428714

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档