在视图控制器和容器视图之间共享数据
Share Data Between View Controller and Container View
我有一个视图控制器,它有一个到第二个视图控制器的 segue,我将一些数据传递给第二个视图控制器以准备 segue。
问题是:第二个视图控制器有一个容器视图,我需要与之共享该数据。我尝试使用 prepare for segue 但在这种情况下它不起作用。
更新:
查看控制器代码:
class ViewController: UITableViewController, ContainerViewDelegate {
var myContainerView = ContainerView()
var id: String!
override func viewDidLoad() {
super.viewDidLoad()
id = "123"
myContainerView.delegate = self
}
func initialize() -> String {
return id
}
}
容器查看代码:
protocol ContainerViewDelegate {
func initialize() -> String
}
class ContainerView: UICollectionViewController {
var delegate: ContainerViewDelegate!
var id: String!
override func viewDidLoad() {
super.viewDidLoad()
id = delegate.initialize()
print(id)
}
}
我收到错误:fatal error: unexpectedly found nil while unwrapping an Optional value
在行:id = delegate.initialize()
您可以使用 prepare for segue 并将您想要的所有内容发送到第二个 Controller ...
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
// get a reference to the second view controller
let secondViewController = segue.destinationViewController as! SecondViewController
// set a variable in the second view controller to pass
secondViewController.data = data
}
双向:
在您的第二个视图控制器中,覆盖 prepare(for:sender:)
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "loadContainerView" { // replace with your segue identifier
let childViewControllerController = segue.destination
// pass data
}
}
在您的第二个视图控制器中,使用 childViewControllers
访问容器视图的控制器。
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
if let childViewController = childViewControllers.first {
// pass your data
}
}
示例项目:
https://www.dropbox.com/s/he97ldzhav2non3/ContainerViewTest.zip?dl=0
您设置委托的方向正确。
在情节提要中:
- 创建一个类型为
Embed Segue
的 Segue,从 ContainerView
到 ViewController 以嵌入。
- Select segue 并设置一个
Identifier
.
在代码中,在prepareForSegue()
中:
- 设置
myContainerView
属性
设置委托
class ViewController: UITableViewController, ContainerViewDelegate {
var myContainerView:ContainerView? // we do initialize it in prepareForSegue()
var id: String!
override func viewDidLoad() {
super.viewDidLoad()
id = "123"
// myContainerView.delegate = self //myContainerView is nil here. We set it in prepareForSegue
}
func initialize() -> String {
return id
}
let embedSegueID = "the identifier you set to your embed segue in Storyboard"
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if (segue.identifier == embedSegueID) {
let dvc = segue.destination as! ContainerView
// Now you have a pointer to EmbeddedViewController.
// You can save the reference to it, or pass data to it.
myContainerView = dvc
myContainerView.delegate = self
}
print(segue.identifier)
}
}
如果您想将数据从您的 ViewController 传递到另一个 ViewController,它嵌入在您的目的地ViewController(我如何理解您的问题),我会:
- 将其传递到目的地ViewController,如上例所示 (prepareForSegue)
- 而不是从目的地ViewController.
将其传递给 viewWillAppear()
中的另一个ViewController
在这种情况下,我如何理解你的用例,你不需要委托并且可以删除所有与委托相关的代码(initialize
,ContainerViewDelegate
协议,属性 var delegate: ContainerViewDelegate!
以及对它的所有调用。
我有一个视图控制器,它有一个到第二个视图控制器的 segue,我将一些数据传递给第二个视图控制器以准备 segue。 问题是:第二个视图控制器有一个容器视图,我需要与之共享该数据。我尝试使用 prepare for segue 但在这种情况下它不起作用。
更新:
查看控制器代码:
class ViewController: UITableViewController, ContainerViewDelegate {
var myContainerView = ContainerView()
var id: String!
override func viewDidLoad() {
super.viewDidLoad()
id = "123"
myContainerView.delegate = self
}
func initialize() -> String {
return id
}
}
容器查看代码:
protocol ContainerViewDelegate {
func initialize() -> String
}
class ContainerView: UICollectionViewController {
var delegate: ContainerViewDelegate!
var id: String!
override func viewDidLoad() {
super.viewDidLoad()
id = delegate.initialize()
print(id)
}
}
我收到错误:fatal error: unexpectedly found nil while unwrapping an Optional value
在行:id = delegate.initialize()
您可以使用 prepare for segue 并将您想要的所有内容发送到第二个 Controller ...
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
// get a reference to the second view controller
let secondViewController = segue.destinationViewController as! SecondViewController
// set a variable in the second view controller to pass
secondViewController.data = data
}
双向:
在您的第二个视图控制器中,覆盖
prepare(for:sender:)
override func prepare(for segue: UIStoryboardSegue, sender: Any?) { if segue.identifier == "loadContainerView" { // replace with your segue identifier let childViewControllerController = segue.destination // pass data } }
在您的第二个视图控制器中,使用
childViewControllers
访问容器视图的控制器。override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) if let childViewController = childViewControllers.first { // pass your data } }
示例项目: https://www.dropbox.com/s/he97ldzhav2non3/ContainerViewTest.zip?dl=0
您设置委托的方向正确。
在情节提要中:
- 创建一个类型为
Embed Segue
的 Segue,从ContainerView
到 ViewController 以嵌入。 - Select segue 并设置一个
Identifier
.
在代码中,在prepareForSegue()
中:
- 设置
myContainerView
属性 设置委托
class ViewController: UITableViewController, ContainerViewDelegate { var myContainerView:ContainerView? // we do initialize it in prepareForSegue() var id: String! override func viewDidLoad() { super.viewDidLoad() id = "123" // myContainerView.delegate = self //myContainerView is nil here. We set it in prepareForSegue } func initialize() -> String { return id } let embedSegueID = "the identifier you set to your embed segue in Storyboard" override func prepare(for segue: UIStoryboardSegue, sender: Any?) { if (segue.identifier == embedSegueID) { let dvc = segue.destination as! ContainerView // Now you have a pointer to EmbeddedViewController. // You can save the reference to it, or pass data to it. myContainerView = dvc myContainerView.delegate = self } print(segue.identifier) } }
如果您想将数据从您的 ViewController 传递到另一个 ViewController,它嵌入在您的目的地ViewController(我如何理解您的问题),我会:
- 将其传递到目的地ViewController,如上例所示 (prepareForSegue)
- 而不是从目的地ViewController. 将其传递给
viewWillAppear()
中的另一个ViewController
在这种情况下,我如何理解你的用例,你不需要委托并且可以删除所有与委托相关的代码(initialize
,ContainerViewDelegate
协议,属性 var delegate: ContainerViewDelegate!
以及对它的所有调用。