我对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名称作为其类名称。
运行代码时,我得到的全是黑屏...对我来说毫无意义。
这里有些错误。没关系,最近添加了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即可实现协调器模式