gpt4 book ai didi

ios - Swinject 将自己的属性注入(inject)新的 UIViewController

转载 作者:行者123 更新时间:2023-11-28 12:22:36 25 4
gpt4 key购买 nike

假设我们有一个 UITableViewController,它在 didSelectRowAtSection 上加载了一个名为即 ClassToInject 的类的实例,它希望通过一个属性注入(inject),因为我们的 ViewControllerToBePushed 有一个属性 ClassToInject,随后(因为它是一个 UITabBarViewController)在 didSet 回调它搜索所有符合 ClassToInjectPresentableviewControllers 属性,简单如下:

protocol ClassToInjectPresentable { 
var property: ClassToInject { get set }
}

到现在为止,我只会做这样的事情:

func didSelectRowAtIndexPath {
let classToInject = self.loadClassToInjectFor(indexPath)
let tabBarViewController = SomeTabBarViewController()
tabBarViewController.property = classToInject
self.navigationController.push(tabBarViewController, animated: true)
}

并且在 SomeTabBarViewController ...

class SomeTabBarViewController: ClassToInjectPresentable {
var property: ClassToInject? {
didSet(newValue) {
self.viewControllers.filter{ $0 is ClassToInjectPresentable }.map{ $0 as! ClassToInjectPresentable }.forEach{ $0.property = newValue }
}
}

所有的东西都应该很容易地加载(但事实并非如此)。我读过有关 Swinject 的文章,这可能会用它来解决。我已经看到很多注册示例,例如:

container.register(Animal.self) { _ in Cat(name: "Mimi") }

但我不知道我是否可以注册一些在self中加载的属性:

container.register(ClassToInjectInjector.self) { _ in 
self.loadClassToInjectFor(indexPath) }
// And then
container.register(ClassToInjectPresentable.self) { _ in
SomeTabBarViewController() }
.initCompleted { r, p in
let tabBar = p as! SomeTabBarViewController
tabBar.property = r.resolve(ClassToInjectInjector.self)
// And lastly?
self.navigationController.pushViewController(tabBar, animated: true)
}
}

最佳答案

在不了解您的应用细节的情况下很难推荐合适的解决方案,但这里有一些建议:

container.register(ClassToInjectInjector.self) { _ in 
self.loadClassToInjectFor(indexPath)
}

一般来说,所有的register 操作都应该在你的对象之外完成。常见的设置是拥有一个全局 Container,其中包含所有注册 - 您应该将它们视为在没有任何隐式上下文的情况下构建应用程序对象的说明。如果您的依赖项需要在 UITableViewController 中创建,您可以将其作为参数传递给 resolve 方法:

container.register(ClassToInjectPresentable.self) { resolver, property in
let tabBar = SomeTabBarViewController()
tabBar.property = property
return tabBar
}

// in UItableVIewController
container.resolve(ClassToInjectPresentable.self,
argument: self.loadClassToInjectFor(indexPath))

这通常也是个坏主意:

.initCompleted { r, p in
...
self.navigationController.pushViewController(tabBar, animated: true)
}

您不应将应用程序逻辑与 DI 混合使用 - 纯粹使用 Swinject 来构建您的依赖项。

所以你的 UITableViewController 可能看起来像这样:

func didSelectRowAtIndexPath {
let classToInject = self.loadClassToInjectFor(indexPath)
let tabBar = container.resolve(
SomeTabBarViewController.self, argument: loadClassToInjectFor(indexPath)
)
navigationController.push(tabBar, animated: true)
}

至于您的 TabBar 及其 View Controller :UIViewControllers 如何进入 TabBar?有可能做这样的事情吗?

class SomeTabBarViewController {
init(viewControllers: [UIViewController]) {
...
}
}

container.register(SomeTabBarViewController.self) { r, property
SomeTabBarViewController(viewControllers:[
r.resolve(MyViewController.self, argument: property),
r.resolve(MyViewController2.self, argument: property)
])
}

关于ios - Swinject 将自己的属性注入(inject)新的 UIViewController,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44356781/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com