Я новичок в Swift / программировании в целом и пытаюсь освоиться с идеей координаторов. Извините, что просто выгрузил код, но я только учусь ... спасибо за любую помощь.
Моя цель - запустить это приложение с моим ViewController, отображаемым на экране, и этим видом, чтобы иметь две кнопки для go, чтобы два других представления.
Я определил следующие протоколы.
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
}
}
Затем я создал свой главный координатор
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 в качестве имени класса.
Все, что я получаю, это полный черный экран, когда я запускаю код ... для меня это не имеет смысла.