我的情景,我有三个Tabbar
viewcontroller
。在这里,tabbar第一viewcontroller
我显示tableview
。如果我单击tableview单元格,它将显示一个弹出的当前模型viewcontroller。在这个目前弹出viewcontroller
我维持两个酒吧按钮取消和完成。如果我点击完成它将解散并显示tabbar
主视图控制器。虽然dismiss
时间我需要传递一些值与按钮标志从当前弹出视图控制器到tabbar主视图控制器。
在这里,我的解雇popup
传递视图控制器代码(VC 2)
@IBAction func apply_click(_ sender: Any) {
print("Dimiss Filter")
dismiss(animated: true, completion: {
if let navView = self.tabBar?.viewControllers?[0] as? UINavigationController {
if let secondTab = navView.viewControllers[0] as? HomeViewController {
secondTab.selectedIndexFromFirstTab = self.selectedIndex
//secondTab.item = self.item
secondTab.tfData = "YES"
}
}
self.tabBar?.selectedIndex = 0
})
}
在这里,Tabbar
主视图控制器code
(接收值)(VC 1)
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
print("SELECTED INDEX:\(selectedIndexFromFirstTab)")
print("RESPONSE:\(tfData)")
}
我没有收到价值,如何解决这个问题。
从我的previous answer中,如果要将子视图中的值传递给主标签栏控制器,则需要对现有代码进行一些更改。
首先,你需要在主要的TabBarViewController
中声明一个方法
func tabPressedWithIndex(index: Int, valueToPass: String) {
print("selected Index: \(index)")
print("Value from user: \(valueToPass)")
}
现在,您需要使用didSelectRowAt
方法将该选项卡栏控制器传递到您的详细信息视图,它将如下所示:
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let vc = self.storyboard?.instantiateViewController(withIdentifier: "DetailViewController") as! DetailViewController
vc.selectedIndex = indexPath.row
vc.tabBar = self.tabBarController as? TabBarViewController // Here you need to assign tab bar controller.
self.present(vc, animated: true, completion: nil)
}
接下来就是当您从详细视图控制器中单击“关闭”按钮时,需要在self.tabBar?.selectedIndex = 1
下面添加一行:
self.tabBar?.tabPressedWithIndex(index: 1, valueToPass: self.userTF.text!)
现在,这会将值传递给主标签栏控制器,方法tabPressedWithIndex
将在主标签中调用和打印您的数据。
查看demo项目了解更多信息。
你可以通过多种方式实现它。使用块/闭包,协议或使用RxSwift而不是使用受控属性或使用受控事件。因为我无法在这里展示一切,所以我会写协议
使用协议
步骤1:
在模态视图控制器中声明协议
@objc protocol ModalViewControllerProtocol {
func dismiss(with data: String)
}
第2步:
提供此ModalViewController的ViewController使其能够确认协议
extension HomeViewController: ModalViewControllerProtocol {
func dismiss(with data: String) {
//use the data here
self.presentedViewController?.dismiss(animated: true, completion: nil)
}
}
第3步:
声明一个变量以在ModalViewController
中保存委托引用
weak var delegate: ModalViewControllerProtocol? = nil
第4步:
在你的ViewCOntroller中,它呈现modalViewController传递self作为ModalViewController的委托,然后再呈现
let modalVC = //...
modalVC.delegate = self
self.present(modalVC, animated: true, completion: nil)
最后在ModAViewController的IBAction中简单调用
@IBAction func apply_click(_ sender: Any) {
self.delegate?.dismiss(with: "your_data_here")
}
使用Block / Closure
步骤1:
在你的模态ViewController中声明一个接受块/闭包的属性
var completionBlock: (((String) -> ()))? = nil
第2步:
在呈现此ModalViewController的ViewController中,在呈现之前传递一个块
let modalVC = //...
modalVC.completionBlock = {(data) in
debugPrint(data)
self.presentedViewController?.dismiss(animated: true, completion: nil)
}
self.present(modalVC, animated: true, completion: nil)
第3步:
最后在你的ModalViewController IBAction中简单地执行传递的块
if let block = completionBlock {
block("your data here")
}
希望能帮助到你
这是解决方案
self.dismiss(animated: true) {
if let tabController = self.presentingViewController as? UITabBarController {
if let navController = tabController.selectedViewController as? UINavigationController {
if let secondTab = navController.viewControllers.first as? HomeViewController {
secondTab.tfData = "YES"
}
} else {
if let secondTab = tabController.selectedViewController as? HomeViewController {
secondTab.tfData = "YES"
}
}
}
}