返回另一个视图时选项卡栏控制器消失

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?

如果您想在应用程序启动时显示标签栏控制器,请将这些代码放在 AppDelegatedidFinishLaunchingWithOptions

 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.