Ios 在Swift中以编程方式从主TabBarController转到嵌套的ViewController
我有以下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 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
}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我已尝试编辑我的答案,请验证它是否对您有帮助。如果你坚持到底,请告诉我。非常感谢。问一个简单的问题,是吗