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

时间:2019-02-20 07:23:41

标签: ios swift uitabbarcontroller uitabbar

我的情况是,我有Tabbar和三个viewcontroller。在这里,标签栏首先显示viewcontroller,我显示的是tableview。如果单击tableview单元格,它将显示一个弹出的当前模型viewcontroller。在此当前弹出窗口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)")
    }

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

3 个答案:

答案 0 :(得分: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步:

在您的ViewCOntroller中,在呈现modalViewController之前,自我将自己作为对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步:

在模态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")
    }

希望有帮助

答案 1 :(得分: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 :(得分:0)

这是解决方案

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