在 Swift 中以编程方式从主 TabBarController 转到嵌套的 ViewController
Go to a nested ViewController from a main TabBarController programmatically in Swift
我有以下 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
的回答,这是你如何做的。
ViewController 1
在 ViewController 1
中,在您的点击事件中添加以下内容。
self.tabBarController?.selectedIndex = 2
let nav = (self.tabBarController?.viewControllers?[2] as? UINavigationController)
let vc = TargetViewController.viewController()
nav?.pushViewController(vc, animated: true)
目标ViewController
在您的 TargetViewController
中添加以下 class 方法。
class func viewController() -> 目标ViewController {
让故事板 = UIStoryboard(名称:"Main",包:无)
return storyboard.instantiateViewController(withIdentifier: "targetViewControllerID") 为!目标ViewController
}
在故事板 ID 字段中添加 targetViewControllerID
。
您可以直接从 Storyboard 中为 TargetViewController 指定标识符,然后从 Storyboard 中加载并推送或呈现它。
喜欢在你的 TargetViewController
中添加此方法
class func viewController () -> TargetViewController {
let storyboard = UIStoryboard(name: "Main", bundle: nil)
return storyboard.instantiateViewController(withIdentifier: "yourIdentifer") as! TargetViewController
}
和点击事件
let vc = TargetViewController.viewController()
self.navigationController?.pushViewController(vc, animated: true)
编辑
看完评论后对你的要求有了清晰的认识
在 ViewController1
的按钮操作上,您想要转到 TargetViewController
,但是当按下返回时您想要返回到 viewController 3
Select 特定索引优先
self.tabBarController?.selectedIndex = 2
之后需要抓取UINavigationController
let nav = (self.tabBarController?.viewControllers?[2] as? UINavigationController)
然后推送 ViewController
let vc = TargetViewController.viewController()
nav?.pushViewController(vc, animated: true)
注意:不要忘记将标识符添加到故事板到 TargetViewController
并将 class func viewController () -> TargetViewController
方法添加到目标 ViewController
希望对您有所帮助
在ViewController1中的一个按钮的动作函数中,你可以这样使用:
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)
我用过同样的解决方案。这是我的工作代码。
我有以下 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
的回答,这是你如何做的。
ViewController 1
在 ViewController 1
中,在您的点击事件中添加以下内容。
self.tabBarController?.selectedIndex = 2
let nav = (self.tabBarController?.viewControllers?[2] as? UINavigationController)
let vc = TargetViewController.viewController()
nav?.pushViewController(vc, animated: true)
目标ViewController
在您的
TargetViewController
中添加以下 class 方法。class func viewController() -> 目标ViewController { 让故事板 = UIStoryboard(名称:"Main",包:无) return storyboard.instantiateViewController(withIdentifier: "targetViewControllerID") 为!目标ViewController }
在故事板 ID 字段中添加
targetViewControllerID
。
您可以直接从 Storyboard 中为 TargetViewController 指定标识符,然后从 Storyboard 中加载并推送或呈现它。
喜欢在你的 TargetViewController
class func viewController () -> TargetViewController {
let storyboard = UIStoryboard(name: "Main", bundle: nil)
return storyboard.instantiateViewController(withIdentifier: "yourIdentifer") as! TargetViewController
}
和点击事件
let vc = TargetViewController.viewController()
self.navigationController?.pushViewController(vc, animated: true)
编辑
看完评论后对你的要求有了清晰的认识
在 ViewController1
的按钮操作上,您想要转到 TargetViewController
,但是当按下返回时您想要返回到 viewController 3
Select 特定索引优先
self.tabBarController?.selectedIndex = 2
之后需要抓取UINavigationController
let nav = (self.tabBarController?.viewControllers?[2] as? UINavigationController)
然后推送 ViewController
let vc = TargetViewController.viewController()
nav?.pushViewController(vc, animated: true)
注意:不要忘记将标识符添加到故事板到 TargetViewController
并将 class func viewController () -> TargetViewController
方法添加到目标 ViewController
希望对您有所帮助
在ViewController1中的一个按钮的动作函数中,你可以这样使用:
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)
我用过同样的解决方案。这是我的工作代码。