Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 在Swift中以编程方式从主TabBarController转到嵌套的ViewController_Ios_Swift_Uinavigationcontroller_Tabbarcontroller - Fatal编程技术网

Ios 在Swift中以编程方式从主TabBarController转到嵌套的ViewController

Ios 在Swift中以编程方式从主TabBarController转到嵌套的ViewController,ios,swift,uinavigationcontroller,tabbarcontroller,Ios,Swift,Uinavigationcontroller,Tabbarcontroller,我有以下ViewController结构,请参见下图 每当我想从ViewController 1移动到任何其他主控制器时,我都会使用self.tabBarController?.selectedIndex=indexNumber // for instance, this would take me to ViewController 3 self.tabBarController?.selectedIndex = 2 根据下图,当点击ViewController 1中的按钮时,如何以编程方式

我有以下ViewController结构,请参见下图

每当我想从
ViewController 1
移动到任何其他主控制器时,我都会使用
self.tabBarController?.selectedIndex=indexNumber

// for instance, this would take me to ViewController 3
self.tabBarController?.selectedIndex = 2
根据下图,当点击ViewController 1中的按钮时,如何以编程方式从
ViewController 1
转到
TargetViewController

供参考- 在下面的图片中,我在
ViewController 3
中显示了一个按钮,这只是为了显示故事板结构,实际的按钮点击将发生在
ViewController 1

编辑: 下面是如何根据Prashant Tukadiya的答案来做的

视图控制器1 在
ViewController 1
中,在点击事件中添加以下内容

    self.tabBarController?.selectedIndex = 2
    let nav = (self.tabBarController?.viewControllers?[2] as? UINavigationController)
    let vc =  TargetViewController.viewController()
    nav?.pushViewController(vc, animated: true)
TargetViewController
  • TargetViewController
    中添加以下类方法

    类func viewController()->TargetViewController{ let storyboard=UIStoryboard(名称:“Main”,捆绑包:nil) 将序列图像板.InstanceEviewController(标识符为:“targetViewControllerID”)返回为!TargetViewController }

  • 在情节提要ID字段中添加
    targetViewControllerID


  • 您可以直接从序列图像板向TargetViewController提供标识符,然后从序列图像板加载并推送或呈现它

    如将此方法添加到
    TargetViewController

    class func viewController () ->  TargetViewController {
        let storyboard = UIStoryboard(name: "Main", bundle: nil)
        return storyboard.instantiateViewController(withIdentifier: "yourIdentifer") as! TargetViewController
    }
    
    let nav = (self.tabBarController?.viewControllers?[2] as? UINavigationController)
    
    和即兴活动

         let vc =  TargetViewController.viewController()
    
        self.navigationController?.pushViewController(vc, animated: true)
    
    编辑

    阅读评论后,我清楚地了解了您的需求

    ViewController1
    的按钮操作中,您希望转到
    TargetViewController
    ,但按back键时,您希望返回到viewcontroller3

    首先选择特定的索引

       self.tabBarController?.selectedIndex = 2
    
    之后,您需要抓取
    UINavigationController

    class func viewController () ->  TargetViewController {
        let storyboard = UIStoryboard(name: "Main", bundle: nil)
        return storyboard.instantiateViewController(withIdentifier: "yourIdentifer") as! TargetViewController
    }
    
    let nav = (self.tabBarController?.viewControllers?[2] as? UINavigationController)
    
    然后按下ViewController

        let vc =  TargetViewController.viewController()
    
        nav?.pushViewController(vc, animated: true)
    
    注意:不要忘记将标识符添加到情节提要中,以
    TargetViewController
    ,并将
    class func viewController()->TargetViewController
    方法添加到TargetViewController


    希望对您有所帮助

    您可以直接从序列图像板向TargetViewController提供标识符,然后从序列图像板加载并推送或呈现它

    如将此方法添加到
    TargetViewController

    class func viewController () ->  TargetViewController {
        let storyboard = UIStoryboard(name: "Main", bundle: nil)
        return storyboard.instantiateViewController(withIdentifier: "yourIdentifer") as! TargetViewController
    }
    
    let nav = (self.tabBarController?.viewControllers?[2] as? UINavigationController)
    
    和即兴活动

         let vc =  TargetViewController.viewController()
    
        self.navigationController?.pushViewController(vc, animated: true)
    
    编辑

    阅读评论后,我清楚地了解了您的需求

    ViewController1
    的按钮操作中,您希望转到
    TargetViewController
    ,但按back键时,您希望返回到viewcontroller3

    首先选择特定的索引

       self.tabBarController?.selectedIndex = 2
    
    之后,您需要抓取
    UINavigationController

    class func viewController () ->  TargetViewController {
        let storyboard = UIStoryboard(name: "Main", bundle: nil)
        return storyboard.instantiateViewController(withIdentifier: "yourIdentifer") as! TargetViewController
    }
    
    let nav = (self.tabBarController?.viewControllers?[2] as? UINavigationController)
    
    然后按下ViewController

        let vc =  TargetViewController.viewController()
    
        nav?.pushViewController(vc, animated: true)
    
    注意:不要忘记将标识符添加到情节提要中,以
    TargetViewController
    ,并将
    class func viewController()->TargetViewController
    方法添加到TargetViewController


    希望对ViewController 1中按钮的操作功能有所帮助,您可以使用:

         func presentMethod(storyBoardName: String, storyBoardID: String) {
            let storyBoard: UIStoryboard = UIStoryboard(name: storyBoardName, bundle: nil)
            let newViewController = storyBoard.instantiateViewController(withIdentifier: storyBoardID)
            self.definesPresentationContext = true
            self.present(newViewController, animated: true, completion: nil)
        }
    
    //usage
    
     presentMethod(storyBoardName: "Main", storyBoardID: "TargetViewController") 
    

    在ViewController 1中按钮的操作功能中,您可以使用:

         func presentMethod(storyBoardName: String, storyBoardID: String) {
            let storyBoard: UIStoryboard = UIStoryboard(name: storyBoardName, bundle: nil)
            let newViewController = storyBoard.instantiateViewController(withIdentifier: storyBoardID)
            self.definesPresentationContext = true
            self.present(newViewController, animated: true, completion: nil)
        }
    
    //usage
    
     presentMethod(storyBoardName: "Main", storyBoardID: "TargetViewController") 
    

    几天前我也遇到了同样的问题,最后,我找到了一个解决办法,也许这会对你有所帮助

        TabController.shared.tabcontroller.selectedIndex = 1
        let navigation  = TabController.shared.tabcontroller.selectedViewController?.navigationController
    
        let SavedAddress = self.storyboard?.instantiateViewController(withIdentifier: "SavedAddressVC") as! SavedAddressVC
        navigation?.pushViewController(SavedAddress, animated: true)
    

    我使用了相同的解决方案。这是我的工作代码。

    几天前我也遇到了同样的问题,最后,我找到了一个解决方案,也许这会对你有所帮助

        TabController.shared.tabcontroller.selectedIndex = 1
        let navigation  = TabController.shared.tabcontroller.selectedViewController?.navigationController
    
        let SavedAddress = self.storyboard?.instantiateViewController(withIdentifier: "SavedAddressVC") as! SavedAddressVC
        navigation?.pushViewController(SavedAddress, animated: true)
    


    我使用了相同的解决方案。这是我的工作代码。

    是否按照您的图表从Viewcontroller-1到Viewcontroller-3到TargetViewController?从
    Viewcontroller 1
    直接到
    TargetViewController
    。点击按钮将发生在
    ViewController 1
    中。是的,但是如果您想从TargetViewController返回(嘿,@fs\u tigre请检查我的答案,可能这会对您有所帮助。如果是这样,@sumitsing是一种方法:)。1.选择第三个选项卡。2.获取第三个选项卡的导航控制器。3.创建TargetVC。4.按下导航控制器第三个选项卡。编辑:您可能需要在导航控制器上调用PoptRoot以避免出现混乱。是否按照您的图表从Viewcontroller-1到Viewcontroller-3到TargetViewController?从
    Viewcontroller 1
    直接到
    TargetViewController
    。点击按钮将发生在
    ViewController 1
    中。是的,但是如果您想从TargetViewController返回(嘿,@fs\u tigre请检查我的答案,可能这会对您有所帮助。如果是这样,@sumitsing是一种方法:)。1.选择第三个选项卡。2.获取第三个选项卡的导航控制器。3.创建TargetVC。4.按下导航控制器第三个选项卡。编辑:您可能需要在导航控制器上调用PoptRoot以避免混乱。我无法完成此操作,没有错误,它只是不起任何作用。谢谢。@fs\u tigre我已尝试编辑我的答案,请验证它是否对您有帮助。如果你坚持到底,请告诉我。非常感谢。快速提问,是否有一种方法可以完成相同的任务,但不必在
    TargetViewController
    中使用class方法?换句话说,我希望调用方法中的所有代码。@fs_tigre是的,可以将
    let vc=self.storyboard.instanceeviewcontroller(带标识符:“YourIdentifier”)编写为!TargetViewController
    而不是
    让vc=TargetViewController.viewController()
    @fs\u tigre它用于代码的可重用性。现在假设你必须从5个不同的地方调用这个vc,那么你必须在5个不同的地方编写相同的代码。另一个例子是你改变情节提要的标识符,然后你必须改变每个地方。希望它能帮上忙,我没办法,没错,它什么都没用。谢谢。@fs\u tigre我已尝试编辑我的答案,请验证它是否对您有帮助。如果你坚持到底,请告诉我。非常感谢。问一个简单的问题,是吗