【问题标题】:How to resolve dependencies swinject (without storyboard), where is another important controller taken as rootVC?如何解决依赖关系 swinject(没有情节提要),另一个重要的控制器在哪里作为 rootVC?
【发布时间】:2019-12-11 02:26:00
【问题描述】:

我的应用中没有情节提要。所以我所有的依赖项都在 App Delegate 中说明了。我阅读了 Swinject 的文档并建议了该选项:

window.rootViewController = container.resolve(PersonViewController.self)

但在我的例子中,根控制器是标签栏控制器 (MainTabBarController()),它设置我的收藏视图和其他选项的布局。如何解决这个问题?

最初,我尝试通过 Swinject Storyboard 完成所有操作,但 storyboardInitCompleted() 对我不起作用,我的 viewModel: ViewModelProtocol! 仍然是 nil(控制台中的解决方案失败)。

应用代理:

 @UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

  var window: UIWindow?
  let container: Container = {
    let container = Container()
    container.register(UnsplashService.self){ _ in UnsplashService()}//.inObjectScope(.container)
    container.register(UnsplashManagerProtocol.self){ r in UnsplashDataFetcher(with: r.resolve(UnsplashService.self)!)}//.inObjectScope(.container)
    container.register(ViewModelProtocol.self){ r in ViewModel(withClient: r.resolve(UnsplashManagerProtocol.self)!)}//.inObjectScope(.container)
    container.register(PhotosCollectionViewController.self) { r in
      let controller = PhotosCollectionViewController()
      controller.viewModel = r.resolve(ViewModelProtocol.self)
      return controller
    }
    return container
  }()

  func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

    window = UIWindow(frame: UIScreen.main.bounds)
    let homeVC = UIViewController()
    homeVC.view.backgroundColor = .white
    window!.rootViewController = MainTabBarController()
    window!.makeKeyAndVisible()
    //window.rootViewController = container.resolve(PhotosCollectionViewController.self)

    return true
  }

MainTabBarController:

class MainTabBarController: UITabBarController {

  var photosVC: PhotosCollectionViewController!
  var likesVC: LikesCollectionViewController!

  override func viewDidLoad() {
    super.viewDidLoad()
     //view.backgroundColor = .white
   }

  override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

    photosVC = PhotosCollectionViewController(collectionViewLayout: WaterfallLayout())

    likesVC = LikesCollectionViewController(collectionViewLayout: UICollectionViewFlowLayout())

    viewControllers = [
      generateNavigationController(rootViewController: photosVC, title: "Photos", image: #imageLiteral(resourceName: "photos")),
      generateNavigationController(rootViewController: likesVC, title: "Favourites", image: #imageLiteral(resourceName: "heart"))
    ]
  }

  private func generateNavigationController(rootViewController: UIViewController, title: String, image: UIImage) -> UIViewController {
    let navigationVC = UINavigationController(rootViewController: rootViewController)
    navigationVC.tabBarItem.title = title
    navigationVC.tabBarItem.image = image
    return navigationVC
  }
}

PhotosCollectionViewController:

class PhotosCollectionViewController: UICollectionViewController {

  var viewModel: ViewModelProtocol!

  ...
}

【问题讨论】:

    标签: ios swift swinject


    【解决方案1】:

    你应该注册你的MainTabBarController

    container.register(MainTabBarController.self) { r in
       let controller = MainTabBarController()
       conteroller.photosVC: r.resolve(PhotosCollectionViewController.self)!
       conteroller.likesVC: r.resolve(LikesCollectionViewController.self)!)
       return controller
    }
    

    并用

    解决它
    window!.rootViewController = container.resolve(MainTabBarController.self)!
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-13
      • 2012-11-05
      • 2015-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-05
      • 1970-01-01
      相关资源
      最近更新 更多