如何通过点击取消按钮显示两个ViewControllers中的一个?

时间:2017-09-06 13:01:57

标签: ios iphone swift swift3 uiviewcontroller

我只需点击TabBarItem就可以点击一个ViewController,或者在导航栏上按加号从表视图控制器B点击。

我的问题

如果通过单击ViewController上的“取消”按钮,我可以转到表视图控制器B,如果我通过单击加号从表视图控制器B点击ViewController,或者如果我通过选择点击ViewController来转到表视图控制器A第二个(蓝色)标签栏项目?

我想在ViewController上设置两个动作取消按钮 - 取决于我想要转到TableViewControllerA或TableViewControllerB的前一个控制器,是否可能?

详情

过渡的第一个版本: 通过单击TableViewControllerB上的Plus按钮,我转到ViewController,然后在ViewController上单击Cancel按钮并返回TableViewControllerB。

过渡的第二个版本: 通过单击TabBar控制器上的第二个TabBarItem,我转到ViewController,然后在ViewController上单击“取消”按钮并返回到TableViewControllerA。

Schema of my project

1 个答案:

答案 0 :(得分:1)

根据您的视图控制器流程图,有两种方法可以实现,您想要什么。

  1. 弹出到根视图控制器
  2. 弹出到特定视图控制器(TableViewController A)
  3. 您需要根据自己的要求决定使用哪些选项。

    在取消按钮中添加/替换以下代码,然后依次尝试这两个选项:

    @IBAction btnCancel_Action(button: UIButton) {
    
        // 1. Pop to root view controller
        self.navigationController?.popToRootViewController(animated: true)
    
        // OR
        // 2. Pop to Specific view controller (TableViewController A)
    
       if let navController = self.navigationController {
    
            for viewcontroller in navController.viewControllers {
                // `TableViewControllerA` class name for view controller or you can use instance of `TableViewControllerA` also with `viewcontroller == <TableViewControllerA>`
    
                if viewcontroller is <TableViewControllerA> { 
                //if viewcontroller == <IntanceOfTableViewControllerA> {  
                   self.navigationController?.popToViewController(viewcontroller, animated: true)
                    break
                }
    
            }
        }
    }
    



    根据问题修改编辑回答:试试这个

    @IBAction btnCancel_Action(button: UIButton) {
     if let tabController = self.tabBarController {
                if tabController.selectedIndex == 0 {
                    self.navigationController?.popViewController(animated: true)
                } else if tabController.selectedIndex == 1 {
                    self.tabBarController?.selectedIndex = 0
    
    
                    // If your tabbar 0 has TableViewControllerB is active on screen then use following code
                    if let navController = self.tabBarController?.navigationController {
                        navController.popToRootViewController(animated: false)
    
                        /*
                        //or
                        DispatchQueue.main.asyncAfter(deadline: .now() + 0.5, execute: {
                            navController.popToRootViewController(animated: false)
                        })
                         */
                    }
    
    
                }
            }
    }