我遵循协调器模式的本教程,到目前为止,我一直在创建协调器,并从app委托运行start()。但是,调用该协调器上的函数不起作用,因为协调器var突然变为零。所显示的初始视图控制器似乎不是来自coordinator.start(),而是来自故事板入口点。我确实禁用了项目目标的主界面中的主界面。
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)
}
}Init视图控制器(故事板中的首字母,但我用协调器显示它):
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将视图控制器从情节提要中提取出来:
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
}
}发布于 2021-03-01 20:36:16
问题仅仅是您正在学习的教程对于当前的情况来说太老了。不再有单一的View模板,不再包含窗口。如果您在Xcode 11或Xcode 12中创建一个项目,则该窗口属于场景委托。实现场景委托的willConnect方法来完成应用程序代表在教程中所做的工作,一切都会活跃起来。
此外,防止Main.storyboard试图自动加载的机制也发生了变化;您必须从Info.plist中的应用程序场景说明中删除它(手工编辑--没有简单的接口)。
https://stackoverflow.com/questions/66428714
复制相似问题