如何设置标志并将一些值从Popup当前模型视图控制器传递到Tabbar在ViewController中使用Swift 4.2?

问题描述 投票:0回答:3

我的情景,我有三个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)")
    }

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

ios swift uitabbarcontroller uitabbar
3个回答
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步:

在你的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")
    }

希望能帮助到你


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"
                    }
                }
            }
        }
© www.soinside.com 2019 - 2024. All rights reserved.