以编程方式制作 UITabBarController 和 UINavigationController Swift 4
Posted
技术标签:
【中文标题】以编程方式制作 UITabBarController 和 UINavigationController Swift 4【英文标题】:Making a UITabBarController and UINavigationController Programmatically Swift 4 【发布时间】:2018-10-27 23:52:58 【问题描述】:我正在尝试以编程方式制作UITabBarController
和UINavigationController
。我尝试了很多教程,但大多数都使用 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】:
如果您要组合UITabBarController
和UINavigationController
,那么您将希望标签栏控制器成为根视图控制器。如果需要,每个选项卡都可以有自己的导航控制器。
如果你将导航控制器设置为根,那么只要你推送一个新的视图控制器,标签栏就会消失。通过将标签栏设为根,您可以拥有一系列导航层次结构,并使用标签按钮在它们之间快速切换。
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的主要内容,如果未能解决你的问题,请参考以下文章