如何使用 Swift 4.2 设置标志并将一些值从 Popup 呈现模型视图控制器传递到 Tabbar 主视图控制器?
Posted
技术标签:
【中文标题】如何使用 Swift 4.2 设置标志并将一些值从 Popup 呈现模型视图控制器传递到 Tabbar 主视图控制器?【英文标题】:How to set flag and pass some values from Popup present model viewcontroller to Tabbar Main Viewcontroller Using Swift 4.2? 【发布时间】:2019-02-20 07:23:41 【问题描述】:我的场景,我有Tabbar
和三个viewcontroller
。在这里,tabbar 首先viewcontroller
我正在显示tableview
。如果我单击 tableview 单元格,它将显示一个弹出式当前模型视图控制器。在此当前弹出窗口viewcontroller
中,我正在维护两个条形按钮取消并完成。如果我单击完成,它将关闭并显示 tabbar
主视图控制器。在dismiss
时,我需要将一些带有按钮标志的值从当前弹出视图控制器传递到标签栏主视图控制器。
在这里,在我的解雇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)")
我没有收到值,如何解决这个问题。
【问题讨论】:
【参考方案1】:在我的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 项目了解更多信息。
【讨论】:
【参考方案2】:您可以通过多种方式实现它。使用块/闭包、协议或者如果你使用 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 步:
在呈现 modalViewController 的 ViewCONtroller 中,在呈现之前将 self 作为委托传递给 ModalViewController
let modalVC = //...
modalVC.delegate = self
self.present(modalVC, animated: true, completion: nil)
最后在 ModalViewController 的 IBAction 中简单调用
@IBAction func apply_click(_ sender: Any)
self.delegate?.dismiss(with: "your_data_here")
使用块/闭包
第 1 步:
在模态视图控制器中声明一个接受块/闭包的属性
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")
希望对你有帮助
【讨论】:
谢谢。您能否更新一下哪个是 tabbar 主视图控制器,哪个是弹出视图控制器。根据我的标题,它将使@Sandeep Bhandari 变得清晰 @devmikle:我已经指定 viewController 是标签栏中的视图控制器,而 modalViewController 是您计划以模态方式呈现的视图控制器 对不起。我无法理解。如果您不介意,请说清楚@Sandeep Bhandari @devmikle :这是一个通用答案,您可以从中获得想法,将其应用到您的场景中 @harjot-singh:无论如何,如果您可以获得对正在呈现的视图控制器的引用,则传递块应该是直截了当的:)【参考方案3】:这就是解决方案
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"
【讨论】:
以上是关于如何使用 Swift 4.2 设置标志并将一些值从 Popup 呈现模型视图控制器传递到 Tabbar 主视图控制器?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Swift 中将值从自定义单元格设置/传递到视图控制器
如何在使用 Swift 关闭 ViewController 期间将值从 ViewController B 传递给 ViewController A? [复制]
如何防止意外触摸触发 swift 4.2 中的 touchesBegan?