以编程方式制作 UITabBarController 和 UINavigationController Swift 4
Making a UITabBarController and UINavigationController Programmatically Swift 4
我正在尝试以编程方式制作 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)
}
什么有效:
- 构建加载到模拟器上
什么不起作用:
加载到模拟器后构建崩溃
崩溃后,错误Thread 1: EXC_BAD_ACCESS (code=2, address=0x7ffee6c2ada8)
出现在JournalTableViewController.swift代码段[=17=的这一行12
]
我认为您的代码段中有错字。在下面的代码中,我们添加了一个中间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
,那么您将希望选项卡栏控制器成为根视图控制器。如果需要,每个选项卡都可以有自己的导航控制器。
如果您将导航控制器设置为根,那么只要您按下一个新的视图控制器,标签栏就会消失。通过使选项卡栏成为根,您可以拥有一系列导航层次结构并使用选项卡按钮在它们之间快速切换。
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
}
您的视图控制器中不需要任何特定代码class。
JournalTableViewController.swift 片段:
override func viewDidLoad() {
super.viewDidLoad()
}
我正在尝试以编程方式制作 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)
}
什么有效:
- 构建加载到模拟器上
什么不起作用:
加载到模拟器后构建崩溃
崩溃后,错误
Thread 1: EXC_BAD_ACCESS (code=2, address=0x7ffee6c2ada8)
出现在JournalTableViewController.swift代码段[=17=的这一行12
]
我认为您的代码段中有错字。在下面的代码中,我们添加了一个中间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
,那么您将希望选项卡栏控制器成为根视图控制器。如果需要,每个选项卡都可以有自己的导航控制器。
如果您将导航控制器设置为根,那么只要您按下一个新的视图控制器,标签栏就会消失。通过使选项卡栏成为根,您可以拥有一系列导航层次结构并使用选项卡按钮在它们之间快速切换。
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
}
您的视图控制器中不需要任何特定代码class。
JournalTableViewController.swift 片段:
override func viewDidLoad() {
super.viewDidLoad()
}