0

我的应用程序中没有情节提要。所以我所有的依赖项都在 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
  }

MainTabBar 控制器:

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
  }
}

照片集合视图控制器:

class PhotosCollectionViewController: UICollectionViewController {

  var viewModel: ViewModelProtocol!

  ...
}
4

1 回答 1

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)!
于 2020-02-12T15:58:45.513 回答