Здесь я создал пример проекта: CustomTabBarViewController
- Вы должны иметь контейнерное представление для дочерних ViewControllers
- Тогда у вас должен быть массив с встраиваемыми ViewControllers
- Вы должны вызвать метод в
CustomTabBarViewController
, который изменит ViewController в представлении контейнера на ViewController из массива VC по индексу, который вы передадите в качестве параметра этого метода
Начните собъявив коллекцию розеток для ваших кнопок TabBar, а также получите ссылку на представление контейнера, где ваши ViewControllers будут показаны
@IBOutlet var tabBarButtons: [UIButton]!
@IBOutlet weak var container: UIView!
, затем создайте массив для элементов панели вкладок
var items: [UIViewController]?
далее создайте ленивые переменныедля ваших контроллеров
private lazy var aVC: A = {
let storyboard = UIStoryboard(name: "Main", bundle: nil)
return storyboard.instantiateViewController(withIdentifier: "a") as! A
}()
private lazy var bVC: B = {
let storyboard = UIStoryboard(name: "Main", bundle: nil)
return storyboard.instantiateViewController(withIdentifier: "b") as! B
}()
.... это можно упростить, создав метод, который возвращает ViewController в зависимости от идентификатора VC
После этого добавьте ViewControllers к вашему items
массив, а также каждый добавить как child
вашего TabBarViewController
override func viewDidLoad() {
super.viewDidLoad()
items = [aVC, bVC]
items!.forEach { addChild($0) }
}
продолжить сh объявив метод для установки ViewController
private func setViewController(_ viewController: UIViewController) {
items!.forEach { $0.view.removeFromSuperview(); $0.willMove(toParent: nil) }
container.addSubview(viewController.view)
viewController.view.frame = container.bounds
viewController.view.autoresizingMask = [.flexibleWidth, .flexibleHeight]
viewController.didMove(toParent: self)
}
, теперь добавьте действие для кнопок панели вкладок и получите индекс кнопки.Затем с этим индексом вызовите ваш tabSelected
метод
@IBAction func buttonPressed(_ sender: UIButton) {
if let index = tabBarButtons.index(of: sender) {
tabSelected(index)
}
}
внутри tabSelected
установите VC из items
в зависимости от индекса кнопки панели вкладок отправителя
func tabSelected(_ index: Int) {
if let item = items?[index] {
setViewController(item)
}
}
наконец в viewDidLoad
установить первый элемент
override func viewDidLoad() {
...
tabSelected(0)
}
Теперь вы можете полностью настроить свой ViewController и создавать другие эпические вещи, которые вы знаете из UITabBarController