总的来说,我是 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 名称作为它们的类名。
当我运行代码时,我得到的只是一个全黑屏......对我来说毫无意义。