UINavigationController和UITabBarController以编程方式(快速4)

UITabBarControllers和UINavigationControllers是iOS开发的主要控制器,它们是在一组ViewController之间导航的好方法。 iOS Clock应用程序是使用UITabBarController作为控制应用程序的主要方式的完美示例。 在线上有大量关于如何使用界面生成器创建UITabBarControllers和UINavigationControllers的教程,但是要完全了解应该如何使用它们,最好知道如何以编程方式从头开始构建它们。

UINavigationController

苹果给出了一个很棒的描述。

“导航控制器管理视图控制器的堆栈,以提供用于分层内容的向下钻取界面。 导航控制器的视图层次结构是自包含的。 它由导航控制器直接管理的视图和由您提供的内容视图控制器管理的视图组成。 每个内容视图控制器管理一个不同的视图层次结构,导航控制器协调这些视图层次结构之间的导航。”

UITabBarController

“您可以使用标签栏控制器将您的应用组织为一种或多种不同的操作模式。 标签栏控制器的视图层次结构是自包含的。 它由选项卡栏控制器直接管理的视图和由您提供的内容视图控制器管理的视图组成。 每个内容视图控制器管理一个不同的视图层次结构,选项卡栏控制器协调视图层次结构之间的导航。”

开始吧!

(作为附带说明,为简单起见,我们将在AppDelegate.swift中创建控制器。还要确保为程序化ViewController更新AppDelegate(window)和info.plist(删除Main.storyboard)。)

1.让我们创建一个标签栏控制器和3个视图控制器。

本质上,我们要做的就是创建视图控制器的实例,并将其分配给标签栏控制器的viewControllers属性。 因此,让我们首先创建一个tabBarController。

 让tabBarController = UITabBarController() 

然后,继续创建三个View Controller(默认ViewController的实例)。 我将它们命名为收藏夹VC,下载VC,历史记录VC,并将视图的标题和backgroundColor属性分别更新为橙色,蓝色和青色。

 让收藏夹VC = ViewController() 
favoriteVC.title =“收藏夹”
favoriteVC.view.backgroundColor = UIColor.orange
 让downloadsVC = ViewController() 
downloadsVC.title =“下载”
downloadsVC.view.backgroundColor = UIColor.blue
 让historyVC = ViewController() 
historyVC.title =“历史记录”
historyVC.view.backgroundColor = UIColor.cyan

2.在我们的默认ViewController中创建一个按钮,并添加一个目标动作。

此步骤是可选的,但为了查看viewControllers与导航栏的后退按钮进行交互,我们将在viewController中添加一些按钮。 在viewDidLoad()中,包括以下内容:

 让按钮:UIButton = UIButton(框架:CGRect(x:view.bounds.width / 2–50,y:view.bounds.height / 2,宽度:100,高度:50)) 
  button.backgroundColor = UIColor.black 
  button.addTarget(self,action:#selector(pushToNextVC),for:.touchUpInside) 
  self.view.addSubview(按钮) 

我将按钮放置在屏幕中央。 让我们在该动作的viewDidLoad()下面添加一个函数。

  func pushToNextVC(){ 
让newVC = UIViewController()
newVC.view.backgroundColor = UIColor.red
self.navigationController?.pushViewController(newVC,动画:
真正)
}

在这里,我只是用红色背景色创建一个新的视图控制器,并将其推送到导航堆栈。

3.为每个ViewController设置tabBarItem。

Apple定义选项卡栏项如下:

“添加到标签栏控制器时代表视图控制器的标签栏项目。”

由于我们已经设置了视图控制器的标题,因此选项卡栏项的默认值将与视图控制器的标题相同。

  favoriteVC.tabBarItem = UITabBarItem(tabBarSystemItem:.favorites,标签:0) 
  downloadsVC.tabBarItem = UITabBarItem(tabBarSystemItem:.downloads,标签:1) 
  historyVC.tabBarItem = UITabBarItem(tabBarSystemItem:.history,标签:2) 

(我在选项卡上使用了默认系统项目Apple。)

4.将tabBarController的viewControllers属性设置为三个viewControllers的数组。

 让控制器= [favoritesVC,downloadsVC,historyVC] 
  tabBarController.viewControllers =控制器 

5.为每个viewController创建并设置一个UINavigationController。

  t̶a̶b̶B̶a̶r̶C̶o̶n̶t̶r̶o̶l̶l̶e̶r̶.v̶i̶e̶w̶C̶o̶n̶t̶r̶o̶l̶l̶e̶r̶s̶=̶̶c̶o̶n̶t̶r̶o̶l̶l̶e̶r̶s̶ 
tabBarController.viewControllers = controllers.map {UINavigationController(rootViewController:$ 0)}

在这里,我们用上面的代码替换了之前的代码。 Swift的map函数允许我们为每个视图控制器创建一个导航控制器,并将其作为数组返回。

让我们运行我们的应用程序!