我有一个具有唯一tag值的数组UIButton 。 当按下给定的按钮时,我想加载并呈现一个UIViewController ,它也存储在一个等长的数组中。 在UIViewController s到呈现的子类的子类UIViewController : 我尝试使用以下方法存储AViewContro ...
提示:本站收集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)
我想转换我的代码,以便通过初始化程序使用依赖注入。
如果可以做到这一点,任何人都可以提出建议,如果可以做到如何?
提前谢谢。
这是不可能的,因为您使用故事板。 当您通过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
。 这个结构体将包含所有必要的字段,所以你不会错过任何一个。 你的典型流程是:
Data
结构var data: Data!
从 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
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.