返回另一个视图时选项卡栏控制器消失
Tab Bar Controller disappearing when moving back to another view
我想创建一个应用程序,让用户可以单击导航栏上 V1 上的按钮。这将继续到 V2,在那里他们可以按下 V2 导航栏上的另一个按钮,这将使他们回到底部有标签栏控制器的 V1。我不想要 V2 上的标签栏,也不希望 V2 作为标签栏项目。当我尝试这个时,当我从 V2 返回到 V1 时,标签栏在 V1 上消失。
TAB BAR CONTROLLER -> TAB BAR ITEM (V1) -> V2(Via navigation bar button item on V1) -> back to V1(Via navigation bar button item on V2)
我已将 [self.navigationController, popViewControllerAnimated:YES];
添加到我的按钮功能,但出现错误 - 容器文字中的预期表达式。
除此代码外,我的应用程序中还没有任何其他代码。
我正在使用 Xcode 8.0 和 Swift 3.0
首先创建 UITabBarController
的子类,然后将属性添加到 AppDelegate
var navController: UINavigationController?
var tabController: MyTabController?
如果您想在应用程序启动时显示标签栏控制器,请将这些代码放在 AppDelegate
中 didFinishLaunchingWithOptions
self.window = UIWindow(frame: UIScreen.main.bounds)
let myStoryboard = UIStoryboard(name: "Main", bundle: nil) as UIStoryboard
self.tabController = myStoryboard.instantiateViewController(withIdentifier: "MyTabController") as? MyTabController
//self.navController = UINavigationController(rootViewController: self.tabController!)
//self.window?.rootViewController = self.navController
self.window?.rootViewController = self.tabController
self.window?.makeKeyAndVisible()
return true
如果您想在登录后跳转到标签栏或其他内容,请将 属性 添加到该控制器
var appDelegate: AppDelegate!
在viewDidLoad
appDelegate = UIApplication.shared.delegate as? AppDelegate
方法应该像
func logIntoApp() {
appDelegate.tabController = self.storyboard?.instantiateViewController(withIdentifier: "MyTabController") as? MyTabController
appDelegate.window?.rootViewController = appDelegate.tabController
}
然后在您的选项卡项目视图控制器中,创建 属性 of AppDelegate
并如上所述分配委托。
方法应该是这样的:
@IBAction func showWithTab(_sender: AnyObject) {
let DefaultVC = self.storyboard?.instantiateViewController(withIdentifier: "DefaultViewController") as! DefaultViewController
self.navigationController?.pushViewController(DefaultVC, animated: true)
}
@IBAction func showWithoutTab(_sender: AnyObject) {
let DefaultVC = self.storyboard?.instantiateViewController(withIdentifier: "DefaultViewController") as! DefaultViewController
// You can create your own animation
UIView.transition(from: (appDelegate.tabController?.view)!, to: (appDelegate.navController?.view)!, duration: 0.3, options: UIViewAnimationOptions.curveEaseIn) { (finished) in
self.appDelegate.window?.rootViewController = self.appDelegate.navController
}
// OR you can use like this way
UIView.transition(from: self.view, to: DefaultVC.view, duration: 0.3, options: UIViewAnimationOptions.curveEaseIn) { (finished) in
self.appDelegate.window?.rootViewController = self.appDelegate.navController
}
}
为什么不使用简单的 Tab Bar?
像这样:
在 VC1 中:
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
myTab.removeFromSuperview()
}
经过几天的努力,我已经解决了我的问题。您需要将其添加到任何视图控制器。
@IBAction func unwindToViewController (sender: UIStoryboardSegue){
}
然后你可以添加一个 segue from bar button item 到视图控制器上的退出图标。
You can view an image of the VC scene here.
我想创建一个应用程序,让用户可以单击导航栏上 V1 上的按钮。这将继续到 V2,在那里他们可以按下 V2 导航栏上的另一个按钮,这将使他们回到底部有标签栏控制器的 V1。我不想要 V2 上的标签栏,也不希望 V2 作为标签栏项目。当我尝试这个时,当我从 V2 返回到 V1 时,标签栏在 V1 上消失。
TAB BAR CONTROLLER -> TAB BAR ITEM (V1) -> V2(Via navigation bar button item on V1) -> back to V1(Via navigation bar button item on V2)
我已将 [self.navigationController, popViewControllerAnimated:YES];
添加到我的按钮功能,但出现错误 - 容器文字中的预期表达式。
除此代码外,我的应用程序中还没有任何其他代码。
我正在使用 Xcode 8.0 和 Swift 3.0
首先创建 UITabBarController
的子类,然后将属性添加到 AppDelegate
var navController: UINavigationController?
var tabController: MyTabController?
如果您想在应用程序启动时显示标签栏控制器,请将这些代码放在 AppDelegate
中 didFinishLaunchingWithOptions
self.window = UIWindow(frame: UIScreen.main.bounds)
let myStoryboard = UIStoryboard(name: "Main", bundle: nil) as UIStoryboard
self.tabController = myStoryboard.instantiateViewController(withIdentifier: "MyTabController") as? MyTabController
//self.navController = UINavigationController(rootViewController: self.tabController!)
//self.window?.rootViewController = self.navController
self.window?.rootViewController = self.tabController
self.window?.makeKeyAndVisible()
return true
如果您想在登录后跳转到标签栏或其他内容,请将 属性 添加到该控制器
var appDelegate: AppDelegate!
在viewDidLoad
appDelegate = UIApplication.shared.delegate as? AppDelegate
方法应该像
func logIntoApp() {
appDelegate.tabController = self.storyboard?.instantiateViewController(withIdentifier: "MyTabController") as? MyTabController
appDelegate.window?.rootViewController = appDelegate.tabController
}
然后在您的选项卡项目视图控制器中,创建 属性 of AppDelegate
并如上所述分配委托。
方法应该是这样的:
@IBAction func showWithTab(_sender: AnyObject) {
let DefaultVC = self.storyboard?.instantiateViewController(withIdentifier: "DefaultViewController") as! DefaultViewController
self.navigationController?.pushViewController(DefaultVC, animated: true)
}
@IBAction func showWithoutTab(_sender: AnyObject) {
let DefaultVC = self.storyboard?.instantiateViewController(withIdentifier: "DefaultViewController") as! DefaultViewController
// You can create your own animation
UIView.transition(from: (appDelegate.tabController?.view)!, to: (appDelegate.navController?.view)!, duration: 0.3, options: UIViewAnimationOptions.curveEaseIn) { (finished) in
self.appDelegate.window?.rootViewController = self.appDelegate.navController
}
// OR you can use like this way
UIView.transition(from: self.view, to: DefaultVC.view, duration: 0.3, options: UIViewAnimationOptions.curveEaseIn) { (finished) in
self.appDelegate.window?.rootViewController = self.appDelegate.navController
}
}
为什么不使用简单的 Tab Bar? 像这样:
在 VC1 中:
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
myTab.removeFromSuperview()
}
经过几天的努力,我已经解决了我的问题。您需要将其添加到任何视图控制器。
@IBAction func unwindToViewController (sender: UIStoryboardSegue){
}
然后你可以添加一个 segue from bar button item 到视图控制器上的退出图标。
You can view an image of the VC scene here.