我的问题是重复的,但我不需要合适的答案。另外,我在how to callback the array of data to another viewController in iOS Swift
之前提出了相同的要求我有一个名为CreateCardViewController的父viewController和一个名为webViewController的子控制器。
在父viewController中,我使用carbonKit来显示选项卡栏菜单。当标签栏菜单的第一个索引是webViewController(这是一个子控制器)。
我的问题是:如何从子控制器发送数据到父控制器?
例如:从一个孩子那里,viewController将获得一个标签栏菜单项列表。在获得标签栏菜单项之后,我需要将菜单项发送到父viewController来显示标签栏。
这是清晰的图片,我正在尝试做:
在您的自定义ChildViewController上添加属性parentViewController
,并在创建该子视图控制器时进行设置。然后,在父视图控制器上实现从子视图控制器接收数据的特定方法。
protocol ParentViewControllerProtocol {
func receiveChildData(_ child: UIViewController, data: Any)
}
class ChildViewController: UIViewController {
var parentViewController: ParentViewControllerProtocol!
func timeToSendDataToParentViewController() {
parentViewController.receiveChildData(self, data: self.data)
}
}
class ParentViewController: UIViewController, ParentViewControllerProtocol {
func receiveChildData(_ child: UIViewController, data: Any) {/*handle data*/}
func addChildViewController() {
let child = ChildViewController();
child.parentViewController = self
// do the rest of adding child to parent
}
}
您可以像@Aqua所说的那样使用委托。或对此进行观察。
class ParentViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
NotificationCenter.default.addObserver(self, selector: #selector(self.updateParentViewController(_:)), name: Notification.Name(rawValue: "updateParentViewController"), object: nil)
}
@IBaction func updateParentViewController(_ notification: NSNotification){
if let receivedData = notification.userInfo?["data"] as? Any {
//use received data
// update your parentViewController.
}
}
}
//.............
class ChildViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
}
func sendDataToParentViewController() {
let dataDict:[String: Any] = ["data"://what you want to send.]
NotificationCenter.default.post(name: . updateParentViewController, object: nil, userInfo: dataDict)
}
}
这对我有用。