如何使用 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?

如何将值从 SceneDelegate 文件传输到 ViewController (Swift 5)

如何将值从组件传递给道具并设置状态

如何将值从javascript传递到iOS UIWebView