从视图控制器加载屏幕

问题描述 投票:0回答:1

我对Swift /编程一般还是陌生的,我正努力使自己对协调员的想法感到满意。抱歉,仅转储代码,但我正在学习..谢谢您的帮助。

我的目标是启动这个应用程序,使我的ViewController出现在屏幕上,并且该视图有两个按钮可以转到其他两个视图。

我已经定义了以下协议。

import Foundation
import UIKit

protocol CoordinatorProtocol {
     var childCoordinators: [CoordinatorProtocol] { get set }
     var navigationController: UINavigationController { get set }

func start()
}

import Foundation
import UIKit

protocol StoryboardProtocol {
static func instantiate() -> Self
}

extension StoryboardProtocol where Self: UIViewController {
    static func instantiate() -> Self {
         let id = String(describing: self)
         let storyboard = UIStoryboard(name: "Main", bundle: Bundle.main)
         return storyboard.instantiateViewController(withIdentifier: id) as! Self
    }
}

然后我创建了我的MainCoordinator

import Foundation
import UIKit

class MainCoordinator: CoordinatorProtocol {

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

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

    func start() {
        let vc = ViewController.instantiate()
        vc.coordinator = self
        navigationController.pushViewController(vc, animated: false)
    }

    func addDisplayOne() {
        let vc = ViewOneController.instantiate()
        vc.coordinator = self
        navigationController.pushViewController(vc, animated: true)
    }

    func addDisplayTwo() {
        let vc = ViewTwoController.instantiate()
        vc.coordinator = self
        navigationController.pushViewController(vc, animated: true)
    }
}

以及我的三个视图控制器

import UIKit

class ViewController: UIViewController, StoryboardProtocol {

    weak var coordinator: MainCoordinator?

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

    @IBAction func oneTapped(_ sender: Any) {
        coordinator?.addDisplayTwo()
    }

    @IBAction func twoTapped(_ sender: Any) {
        coordinator?.addDisplayTwo()
    }
}

import UIKit

class ViewOneController: UIViewController, StoryboardProtocol {

    weak var coordinator: MainCoordinator?

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

import UIKit

class ViewTwoController: UIViewController, StoryboardProtocol {

    weak var coordinator: MainCoordinator?

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

然后我用以下内容更新了appDelegate.Swift,其余功能保持不变

var coordinator: MainCoordinator?
var window: UIWindow?

func application(_ application: UIApplication, didFinishLaunchingWithOptions 
    launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

    let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: Bundle.main)
    let initialViewController : UIViewController = 
        mainStoryboard.instantiateViewController(withIdentifier: "ViewController") as 
        UIViewController
    self.window = UIWindow(frame: UIScreen.main.bounds)
    self.window?.rootViewController = initialViewController
    self.window?.makeKeyAndVisible()

    return true
}

然后我用以下内容更新了SceneDelegate.swift,其余部分保持不变

var window: UIWindow?

func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {

    if let controller = UIStoryboard(name: "Main", bundle: 
    nil).instantiateViewController(withIdentifier: "ViewController") as? ViewController {
        if let window = self.window, let rootViewController = window.rootViewController {
            var currentController = rootViewController
            while let presentedController = currentController.presentedViewController {
                currentController = presentedController
            }
            currentController.present(controller, animated: true, completion: nil)
        }
    }

}

我有一个Main.storyboard,其中包含三个视图控制器。每个视图控制器都有其类和其StoryboardID名称作为其类名称。

运行代码时,我得到的全是黑屏...对我来说毫无意义。

swift viewcontroller coordinator-pattern
1个回答
0
投票

这里有些错误。没关系,最近添加了SceneDelegate.swift。

您的主要问题是,在SceneDelegate的willConnectTo中,您的if let window = self.window 是nil,因此其中的其余代码将不会执行,从而导致黑屏。

为了使Coordinator模式在SceneDelegate.swift中的情节提要中起作用,请添加这两个属性并将willConnectTo替换为以下内容:

    var coordinator: MainCoordinator?
    var window: UIWindow?


    func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {        
        let navController = UINavigationController() //create navController
        coordinator = MainCoordinator(navigationController: navController) //initialize our coordinator
        coordinator?.start() //start coordinator

        guard let windowScene = (scene as? UIWindowScene) else { return }
        window = UIWindow(frame: UIScreen.main.bounds)
        window?.rootViewController = navController //make it our root
        window?.makeKeyAndVisible()
        window?.windowScene = windowScene
    }

最后,您的AppDelegate.swift的didFinishLaunchingWithOptions函数主体不需要任何东西,但返回true即可实现协调器模式

随时使用它作为参考:https://github.com/SamuelFolledo/NewsApp/blob/646a005e1be9b90a4c63cb99bf92d5b2be6691cc/NewsApp/SceneDelegate.swift

© www.soinside.com 2019 - 2024. All rights reserved.