以编程方式制作 UITabBarController 和 UINavigationController Swift 4

Posted

技术标签:

【中文标题】以编程方式制作 UITabBarController 和 UINavigationController Swift 4【英文标题】:Making a UITabBarController and UINavigationController Programmatically Swift 4 【发布时间】:2018-10-27 23:52:58 【问题描述】:

我正在尝试以编程方式制作UITabBarControllerUINavigationController。我尝试了很多教程,但大多数都使用 Swift 3,它太过时了,无法使用。

AppDelegate.swift 片段:

var window: UIWindow?

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool 
    // Override point for customization after application launch.

    window = UIWindow(frame: UIScreen.main.bounds)
    let journalVC = JournalTableViewController()
    let navController = UINavigationController(rootViewController: journalVC)
    window?.rootViewController = navController
    window?.makeKeyAndVisible()

    return true

JournalTableViewController.swift 片段:

var tabBarCnt = UITabBarController()

override func viewDidLoad() 
    super.viewDidLoad()

    tabBarCnt = UITabBarController()
    tabBarCnt.tabBar.barStyle = .black

    let journalVC = JournalTableViewController()
    journalVC.tabBarItem = UITabBarItem(tabBarSystemItem: .favorites, tag: 0)

    tabBarCnt.viewControllers = [journalVC]
    self.view.addSubview(tabBarCnt.view)


什么有效:

构建加载到模拟器上

什么不起作用:

加载到模拟器后构建崩溃

崩溃后,JournalTableViewController.swift Snippet

12这一行出现错误Thread 1: EXC_BAD_ACCESS (code=2, address=0x7ffee6c2ada8)

【问题讨论】:

在日志表视图控制器的 viewdidload 中,您正在实例化另一个日志表视图控制器,这将永远存在。您创建标签栏的方式不正确。 如果您想同时使用导航控制器和标签栏,您可能希望标签栏控制器成为您的根视图控制器。在每个选项卡中,您可以使用每个选项卡的相关第一个视图控制器创建一个单独的 UINavigationController。这样,用户可以在选项卡之间切换并在每个选项卡中导航一堆视图控制器 @Paulw11 看起来可能可行,但您认为您可以使用一些代码将其作为答案发布吗? 【参考方案1】:

如果您要组合UITabBarControllerUINavigationController,那么您将希望标签栏控制器成为根视图控制器。如果需要,每个选项卡都可以有自己的导航控制器。

如果你将导航控制器设置为根,那么只要你推送一个新的视图控制器,标签栏就会消失。通过将标签栏设为根,您可以拥有一系列导航层次结构,并使用标签按钮在它们之间快速切换。

AppDelegate.swift

var window: UIWindow?

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool 
// Override point for customization after application launch.

    window = UIWindow(frame: UIScreen.main.bounds)

    let journalVC = JournalViewController()
    let navController = UINavigationController(rootViewController: journalVC)

    let tabBarController = UITabBarController()
    navController.tabBarItem = UITabBarItem(tabBarSystemItem: .favorites, tag: 0)
    tabBarController.viewControllers = [navController]

    window?.rootViewController = tabBarController
    window?.makeKeyAndVisible()

    return true

您的视图控制器类中不需要任何特定代码。

JournalTableViewController.swift 片段:

override func viewDidLoad() 
    super.viewDidLoad()

【讨论】:

navController没有在您提供的解决方案中使用,这是一个错误吗? 为什么将tabBarItem 设置为journalVC 而不是navController【参考方案2】:

我认为您的 sn-p 中有错字。在下面的代码中,我们添加了一个中间vc来解决递归问题。

var window: UIWindow?

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool 
// Override point for customization after application launch.

window = UIWindow(frame: UIScreen.main.bounds)
let journalVC = JournalViewController()
let navController = UINavigationController(rootViewController: journalVC)
window?.rootViewController = navController
window?.makeKeyAndVisible()

return true

这里是日志vc:

class JournalViewController: UIViewController

var tabBarCnt = UITabBarController()

override func viewDidLoad() 
    super.viewDidLoad()

    tabBarCnt = UITabBarController()
    tabBarCnt.tabBar.barStyle = .black

    let journalVC = JournalTableViewController()
    journalVC.tabBarItem = UITabBarItem(tabBarSystemItem: .favorites, tag: 0)

    tabBarCnt.viewControllers = [journalVC]
    self.view.addSubview(tabBarCnt.view)

  

 

而tableviewcontroller应该是这样的:

class JournalTableViewController: UITableViewController


 

【讨论】:

这不会添加 UITabBarController - 只是 UINavigationController 出现 我认为这不是正确的答案,tabBarController 应该是 root 而不是 navController,而这个 rootViewController 将为其每个选项卡项包含一个 navigationController。

以上是关于以编程方式制作 UITabBarController 和 UINavigationController Swift 4的主要内容,如果未能解决你的问题,请参考以下文章

在 Swift 中以编程方式制作 Segue

以编程方式制作 UITabBarController 和 UINavigationController Swift 4

以编程方式制作第一个屏幕

如何在以编程方式制作滚动视图时解决此问题?

Swift以编程方式制作宽度百分比

iOS:以编程方式制作屏幕截图的最快、最高效的方法是啥?