繁体   English   中英

UIViewControllers iOS swift中的依赖注入

Dependency injection in UIViewControllers iOS swift

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

首先我检查了这篇文章,它没有用

我想对从控制器到另一个控制器的导航应用依赖注入,

假设我有控制器 A :

import UIKit

class A: UIViewController {

}

和控制器 B :

import UIKit

class B: UIViewController {

       var name : String!

}

我正在以这种方式从 A 导航到 B:

let bViewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "BVC")
as! B
bViewController.name = "HelloWorld"
self.navigationController?.pushViewController(bViewController, animated: true)

我想转换我的代码,以便通过初始化程序使用依赖注入。

如果可以做到这一点,任何人都可以提出建议,如果可以做到如何?

提前谢谢。

3 个回复

这是不可能的,因为您使用故事板。 当您通过instantiateViewController方法从 Storyboard instantiateViewController化 ViewController 时,它使用required init?(coder aDecoder: NSCoder)初始化程序。

如果要使用自定义初始化程序,则需要摆脱 Storyboards 并仅从代码或从xib文件创建UIViewController 所以你将能够做到这一点:

import UIKit

class B: UIViewController {
    var name: String!

    init(name: String) {
        self.name = name
        super.init(nibName: nil, bundle: nil) # or NIB name here if you'll use xib file
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }
}

您还需要提供init(coder...)因为每个 UI 元素都可以从 Storyboard 实例化。 但是您可以将其保留为默认的super调用,因为您不会使用它。

另一种选择是在问题开头的帖子中使用 ViewController 中的static方法。 但实际上它也在 ViewController 初始化之后分配变量。

所以现在没有通过初始化程序的 DI。 我建议对需要注入 VC 的所有数据使用单独的struct 这个结构体将包含所有必要的字段,所以你不会错过任何一个。 你的典型流程是:

  1. 从 Storyboard 实例化 VC
  2. 实例化Data结构
  3. 将数据分配给 VC 的var data: Data!
  4. 使用所有注入的变量

从 iOS13 开始,Apple 添加了允许我们在初始化时进行依赖注入的功能。

您可以通过在UIStoryboard上使用一个名为instantiateViewController(identifier:creator:)的新方法来做到这一点。 您必须在要向其传递数据的视图控制器中使用所需的数据和编码器定义自己的init ,然后在父/呈现视图控制器中使用上述方法调用此 init。

请参阅下面的链接文档和示例。

class ParentViewController: UIViewController {

    @IBAction private func button() {
        let controller = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(identifier: "ChildViewController") { coder in
            return ChildViewController(coder: coder, userId: "123")
        }

        navigationController?.pushViewController(controller, animated: true)
    }

}

class ChildViewController: UIViewController {

    var userId: String

    init?(coder: NSCoder, userId: String) {
        self.userId = userId
        super.init(coder: coder)
    }

    required init?(coder: NSCoder) {
        fatalError("Missing user id.")
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        print("UserId: \(userId)")
    }

}
class UserCredentials {

private let userDefaults: NSUserDefaults

private let authorizationTokenKey = "AuthorizationTokenKey"

init(userDefaults: NSUserDefaults) {
    self.userDefaults = userDefaults
}

func getAuthorizationToken() -> String {
    let value = userDefaults.stringForKey(authorizationTokenKey)
    guard let retVal = value else { return "" }
    return retVal
}
}
3 Swift 中的依赖注入

我完全爱上了依赖注入。 我喜欢它让你有可能遵循 SOLID 原则的方式,它防止意大利面代码的方式。 我在我的一个 Android 项目中使用了 Dagger,一切都更加干净、模块化和可测试。 现在我正在做一个 Swift 项目。 我想在不使用任何第三方库的情况下遵循这种设计模式(由于缺乏当前的代码库 ...

4 iOS中的依赖注入

基本上,我试图使用iOS中可用的XCTest Framework编写测试用例。 因此,我遇到了这个DI,并在Google上进行了探索,在那里我遇到了Stack Overflow和Objection 。 但是我无法理解如何将其集成到项目中。 有人可以指导我如何实现这一目标吗? 是否有必 ...

5 在iOS中嵌套UIViewControllers

考虑一个UIViewController其视图包含另一个UIViewController的视图。 说父UIViewController负责调用子控制器的生命周期方法是否正确? 方法如: 例如: 如果是这样,必须调用哪些方法? 有一个更好的方法吗? 显然,上述方法不 ...

8 Swift 中的相互依赖注入

我按如下方式相互注入类,但是当我运行应用程序时,应用程序崩溃。 这个实现有什么问题? 它显示 unsafeMutableAddressor。 ...

2020-10-22 22:12:58 0 49   swift
暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM