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