阻止iOS应用加载默认情节提要入口点
我遵循协调器模式,到目前为止,我已经完成了创建协调器和从app委托运行start()的过程。但是,在该协调器上调用函数是不起作用的,因为协调器变量突然变为nil。似乎显示的初始视图控制器不是来自coordinator.start()的控制器,而是来自storyboard入口点的控制器。我确实在项目目标的主界面中禁用了Main AppDelegate:阻止iOS应用加载默认情节提要入口点,ios,swift,xcode,coordinator-pattern,Ios,Swift,Xcode,Coordinator Pattern,我遵循协调器模式,到目前为止,我已经完成了创建协调器和从app委托运行start()的过程。但是,在该协调器上调用函数是不起作用的,因为协调器变量突然变为nil。似乎显示的初始视图控制器不是来自coordinator.start()的控制器,而是来自storyboard入口点的控制器。我确实在项目目标的主界面中禁用了Main AppDelegate: func application(_ application: UIApplication, didFinishLaunchingWithOpti
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中的应用程序场景清单中删除(手动编辑-没有简单的界面)。我已经编写了一个现代化版本的教程项目,因此您可以下载该项目并从那里开始:-它可以立即运行!非常感谢。我在想,在某一点上,它必须是场景,因为它不在教程中