阻止iOS应用加载默认情节提要入口点

阻止iOS应用加载默认情节提要入口点,ios,swift,xcode,coordinator-pattern,Ios,Swift,Xcode,Coordinator Pattern,我遵循协调器模式,到目前为止,我已经完成了创建协调器和从app委托运行start()的过程。但是,在该协调器上调用函数是不起作用的,因为协调器变量突然变为nil。似乎显示的初始视图控制器不是来自coordinator.start()的控制器,而是来自storyboard入口点的控制器。我确实在项目目标的主界面中禁用了Main AppDelegate: func application(_ application: UIApplication, didFinishLaunchingWithOpti

我遵循协调器模式,到目前为止,我已经完成了创建协调器和从app委托运行start()的过程。但是,在该协调器上调用函数是不起作用的,因为协调器变量突然变为nil。似乎显示的初始视图控制器不是来自coordinator.start()的控制器,而是来自storyboard入口点的控制器。我确实在项目目标的主界面中禁用了Main

AppDelegate:

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
} 
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)
    }
}
主要协调人:

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
} 
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 view controller(故事板中的首字母,但我用协调器显示):

情节提要协议-用于按id将视图控制器从情节提要中取出:

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
    }
}

问题只是你正在看的教程对于当前的情况来说太旧了。不再有单一视图应用程序模板,应用程序代理不再包含该窗口。如果在Xcode 11或Xcode 12中创建项目,则该窗口归场景代理所有。实现场景代理的
willConnect
方法来完成应用程序代理在教程中所做的工作,一切都会变得栩栩如生


防止Main.storyboard尝试自动加载的机制也已更改;您必须将其从Info.plist中的应用程序场景清单中删除(手动编辑-没有简单的界面)。

我已经编写了一个现代化版本的教程项目,因此您可以下载该项目并从那里开始:-它可以立即运行!非常感谢。我在想,在某一点上,它必须是场景,因为它不在教程中