簡體   English   中英

防止 iOS 應用程序加載默認 Storyboard 入口點

[英]Prevent iOS app from loading default Storyboard entry point

我正在關注協調器模式的本教程,到目前為止,我已經完成了創建協調器並從應用程序委托運行 start() 的過程。 但是隨后在該協調器上調用 function 不起作用,因為突然協調器 var 為零。 似乎顯示的初始視圖 controller 不是來自 coordinator.start() 的視圖,而是來自 storyboard 入口點的視圖。 我確實在項目目標的主界面中禁用了 Main。

應用委托:

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

初始化視圖 controller (storyboard 中的初始視圖,但我正在與協調員一起展示它):

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 從 storyboard 中獲取視圖 controller:

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

問題僅僅是您正在查看的教程對於當前條件來說太舊了。 不再有 Single View App 模板,App Delegate 不再包含 window。 如果您在 Xcode 11 或 Xcode 12 中創建項目,則 window 歸場景委托所有。 實現場景代理的willConnect方法來完成應用程序代理在教程中所做的工作,一切都會 spring 栩栩如生。

防止Main.storyboard嘗試自動加載的機制也發生了變化; 您必須將其從Info.plist中的 Application Scene Manifest 中刪除(手動編輯 - 沒有簡單的界面)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM