0

Hi I am trying to apply swinject for my IOS project and currently I have been stuck..

I have 2 part in my application

  1. LOGIN Part
  2. MAIN Part

Scenario is if it's logged in already when application begins or when login is successfully done, it should be moved to MAIN Part and I hope to Each of them has their own storyboard that the swinject scope manages the instances separately.

when login is done, the MAIN part injected instance should be newly generated and when logout is done, it should be going back to LOGIN part and the main part injected instance must be gone..

The below is my view controllers structure:

LOGIN and MAIN view controllers structure Image

with this designation, I am trying to navigate to MAIN views with the codes below but keep getting error.

    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
        }

        // add these lines
        let storyboard = UIStoryboard(name: "Main", bundle: nil)

        // if user is logged in before
        if let loggedUsername = UserDefaults.standard.string(forKey: "username") {
            // instantiate the main tab bar controller and set it as root view controller
            // using the storyboard identifier we set earlier
            let storyboard = UIStoryboard(name: "Main", bundle: nil)
            let mainTabBarController = storyboard.instantiateViewController(identifier: "MainTabBarController")
            window?.rootViewController = mainTabBarController
        } else {
            // if user isn't logged in
            // instantiate the navigation controller and set it as root view controller
            // using the storyboard identifier we set earlier
            let loginNavController = storyboard.instantiateViewController(identifier: "LoginNavigationController")
            window?.rootViewController = loginNavController
        }
    }
extension SwinjectStoryboard {
    @objc class func setup() {

        defaultContainer.autoregister(UserProvider.self, initializer: UserProvider.init).inObjectScope(.container)

        defaultContainer.storyboardInitCompleted(HomeViewController.self) { resolver, controller in
            controller.userProvider = resolver ~> UserProvider.self
        }
    }
}
Storyboard (<SwinjectStoryboard.SwinjectStoryboard: 0x600002304300>) doesn't contain a view controller with identifier 'MainTabBarController'

What am I supposed to do for solving this??

funie200
  • 3,688
  • 5
  • 21
  • 34

1 Answers1

0

AppDelegate in

var window: UIWindow?
    
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {    
    self.window = UIWindow(frame: UIScreen.main.bounds)
    return     
}

SceneDelegate in HomeVC your Main Part and LoginVC your Login part for example my code

Login successfuly staus 1 than USERDEFAULT.set(true, forKey: "isLogin")

var window: UIWindow?
var navigationC: UINavigationController?
private(set) static var shared: SceneDelegate?


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 }
    
    
    if USERDEFAULT.value(forKey:"isLogin") != nil{
        let homevc = MainStoryboard.instantiateViewController(withIdentifier: "ContainerViewController") as! ContainerViewController
        self.navigationC = UINavigationController(rootViewController: homevc)
    } else{
        let loginvc = MainStoryboard.instantiateViewController(withIdentifier: "LoginVC") as! LoginVC
        self.navigationC = UINavigationController(rootViewController: loginvc)
    }
    self.navigationC!.setNavigationBarHidden(true, animated: false)
    self.window?.clipsToBounds = true
    self.window?.rootViewController = navigationC
    self.window?.makeKeyAndVisible()
    Self.shared = self
}
Himanshu Patel
  • 1,015
  • 8
  • 26