Swinject - как разрешить один и тот же контроллер дважды с одного распознавателя? - PullRequest
0 голосов
/ 24 августа 2018
import Swinject

class GenericsAssembly: Assembly {
    func assemble(container: Container) {
        container.register(TabBarController.self) { resolver in
            let split1 = resolver.resolve(SplitViewController.self)!
            let split2 = resolver.resolve(SplitViewController.self)!
            split1.tabBarItem = UITabBarItem(title: "1", image: UIImage(named: "icon-notepad"), selectedImage: nil)
            split2.tabBarItem = UITabBarItem(title: "2", image: UIImage(named: "icon-chat"), selectedImage: nil)
            let controller = TabBarController(view: resolver.resolve(TabBarView.self)!)
            controller.viewControllers = [
                tasksSplitViewController,
                threadsSplitViewController
            ]
            return controller
        }
        container.register(SplitViewController.self) { _ in
            return SplitViewController()
        }
        container.register(TabBarView.self) { _ in
            return TabBarView()
        }
    }
}

И ... внизу есть только один TabBarItem. Почему?

Если я использую это так:

let split1 = SplitViewController()
let split2 = SplitViewController()

тогда все в порядке .;) Что не так с Swinject здесь в моей реализации?

Ответы [ 2 ]

0 голосов
/ 24 августа 2018

Если вам нужно разрешить два разных экземпляра в одном закрытии register, вам нужно использовать .transient область действия объекта:

container.register(SplitViewController.self) { _ in SplitViewController() }
    .inObjectScope(.transient)

Подробнее о областях объекта можно прочитать в документы .

0 голосов
/ 24 августа 2018

Вы можете попробовать использовать это:

container.register(SplitViewController.self, name: "second") { _ in
    return SplitViewController()
}

let split2 = container.resolve(SplitViewController.self, name: "second")

, иначе контейнер вернет уже разрешенный контроллер

...