如何使用 Swift 4.2 设置标志并将一些值从 Popup 当前模型 viewcontroller 传递到 Tabbar Main Viewcontroller?

How to set flag and pass some values from Popup present model viewcontroller to Tabbar Main Viewcontroller Using Swift 4.2?

我的情况是 Tabbar 和三个 viewcontroller。在这里,tabbar 优先 viewcontroller 我显示 tableview。如果我单击 tableview 单元格,它将显示一个弹出式当前模型 viewcontroller。在当前的弹出窗口 viewcontroller 中,我维护了两个栏按钮取消和完成。如果我点击完成,它将关闭并显示 tabbar 主视图控制器。虽然 dismiss 时间我需要将一些带有按钮标志的值从当前弹出视图控制器传递到主标签栏 viewcontroller。

在这里,在我的解雇下面 popup 传递 viewcontroller 代码 (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)")
    }

我没有收到值,如何解决这个问题。

您可以通过多种方式实现它。使用 blocks/closures 协议,或者如果你正在使用 RxSwift,而不是使用受控 属性 或使用受控事件。因为我无法在这里演示所有内容,所以我将编写协议

使用协议

第 1 步:

在模态视图控制器中声明一个协议

@objc protocol ModalViewControllerProtocol {
    func dismiss(with data: String)
}

第 2 步:

ViewController 显示此ModalViewController 使其确认协议

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的ViewCOntroller中,在呈现

之前将自己作为委托传递给模态ViewController
    let modalVC = //...
    modalVC.delegate = self
    self.present(modalVC, animated: true, completion: nil)

最后在Modal的IBAction中ViewController直接调用

@IBAction func apply_click(_ sender: Any) {
    self.delegate?.dismiss(with: "your_data_here")
}

使用Block/Closure

第 1 步:

在你的模式 ViewController 中声明一个 属性 接受 block/closure

var completionBlock: (((String) -> ()))? = nil

第 2 步:

在显示此模态ViewController的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")
    }

希望对您有所帮助

根据我的 如果您想将值从子视图传递到主选项卡栏控制器,您需要对现有代码进行一些更改。

为此,首先您需要在主程序中声明一个方法 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 项目了解更多信息。

这就是解决方案

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"
                    }
                }
            }
        }