协调器为零,单击按钮时不会导航到下一个屏幕

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

我一直在尝试重构我的源代码,使其符合协调器模式。我使用

UITabBarController
作为我的应用程序的父视图控制器,其中包含 4 个视图控制器。

我一直在关注如何为 iOS 应用程序实现协调器模式的教程,并且我已经创建并设置了协调器的协议和类。我的 viewController(TabbarViewController 的子 viewController)内有一个按钮,但是,单击按钮时,协调器不会推送/导航到所需的 VC,并且我看到协调器在通过调试控制台进行调试时正在返回

nil
breakpoint
,我不知道如何解决这个问题。

MainCoordinator.swift:

class MainCoordinator: SubCoordinator {
    var subCoordinators = [SubCoordinator]()
    var navigationController: UINavigationController
    
    init(navigationController: UINavigationController) {
        self.navigationController = navigationController
    }
    func start() {
        print("Initialized.. .")
        UIApplication.app().window?.rootViewController = self.navigationController
        let vc = SplashViewController.instantiate()
        vc.coordinator = self
        navigationController.pushViewController(vc, animated: false)
    }
        }
   // testing using a simple Viewcontroller class, its background color is set to red, so if the  
   // navigation works, a blank red VC should appear. but not working so far
    func testView() {
        let vc = ViewController.instantiate()
        vc.coordinator = self
        navigationController.pushViewController(vc, animated: false)
       
    }
}

SubCoordinator.swift:

protocol SubCoordinator {
    var subCoordinators: [SubCoordinator] { get set }
    var navigationController: UINavigationController { get set }
    
    func start()
}

StoryBoarded.swift

protocol StoryBoarded {
    static func instantiate() -> Self
}
  // I am using storyBoard, and `instantiate()` should instantiate and return the specified VC 
  // from the Storyboard with the specified VC id (?)
extension StoryBoarded where Self: UIViewController {
    static func instantiate() -> Self {
        let id = String(describing: self)
        let storyboard = UIStoryboard(name: "Main", bundle: nil)
        return storyboard.instantiateViewController(withIdentifier: id) as! Self
    }
}

FirstViewController.Swift:

class FirstViewController: UIViewController, StoryBoarded {
    @IBOutlet weak var button: UIButton!
    var coordinator: MainCoordinator?
    //MARK: - viewDidLoad()
    override func viewDidLoad() {
        super.viewDidLoad()
   // If uncommented the below line, coordinator is not returning `nil`, but not navigating 
      anyways!
        //coordinator = MainCoordinator(navigationController: UINavigationController())
    }
    @IBAction func onButtonTap(_ sender: Any) {
   // So, basically I would expect the coordinator to navigate to the testView, but not 
      navigating
        coordinator?.testView()
    }
}

ViewController.swift:

// testView
class ViewController: UIViewController, StoryBoarded {
    var coordinator: MainCoordinator?

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        self.view.backgroundColor = .red
    }

}

// TabbarController, set as the root VC after the splashVC is completed
class MainViewController: UITabBarController, StoryBoarded {
    var coordinator: MainCoordinator?
    
    override func viewDidLoad() {
        super.viewDidLoad()
        let firstVC = UIStoryboard.firstViewController()
        let secondVC = UIStoryboard.secondViewController()
        
        let views: [UIViewController] = [firstVC, secondVC]
        self.setViewControllers(views, animated: false)
        self.navigationController?.navigationBar.isHidden = false
    }
    
}

start()
正在被调用,splashVC 出现并在完成时使用
MainViewontroller
更新 rootViewController,但导航在按钮单击事件上根本不起作用。

任何反馈或帮助将不胜感激!

ios swift mvvm coordinator-pattern
2个回答
0
投票

由于您使用的是 StoryBoarded 协议,因此您应该遵循该模式并调用 instantiate() 进行初始化。然后,设置协调器即可。

class MainViewController: UITabBarController, StoryBoarded {
  var coordinator: MainCoordinator?

  override func viewDidLoad() {
    super.viewDidLoad()
    let firstVC = FirstViewController.instantiate()
    let secondVC = SecondViewController.instantiate()

    firstVC.coordinator = self.coordinator
    secondVC.coordinator = self.coordinator
    
    let views: [UIViewController] = [firstVC, secondVC]
    self.setViewControllers(views, animated: false)
    self.navigationController?.navigationBar.isHidden = false
  }
}

0
投票

这个工作正常了。

参考:https://www.youtube.com/watch?v=Tb3PlVFq3YY,时间:6.59

由于某种原因,我无法让我的项目工作,因为协调员为零,我可以看到黑屏。在查看其他示例时,我通过移动 willConnectTo 方法下的 SceneDelegate.swift 内设置的窗口来使其工作。我还必须添加这条额外的行才能使事情正常工作 window?.windowScene = windowScene

 func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
        // Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`.
        // If using a storyboard, the `window` property will automatically be initialized and attached to the scene.
        // This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead).
        guard let _ = (scene as? UIWindowScene) else { return }
        
        guard let windowScene = (scene as? UIWindowScene) else {
            return
        }
        
    
        window = UIWindow(frame: UIScreen.main.bounds)
        window?.windowScene = windowScene
        
        let navController = UINavigationController()
        coordinator = MainCoordinator(navigationController: navController)
        coordinator?.start()
        
        window?.rootViewController = navController
        window?.makeKeyAndVisible()
    }

参考

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