Отображение и переключение между ViewController в другом ViewController - PullRequest
0 голосов
/ 28 декабря 2018

Я в основном пытаюсь создать пользовательский UITabBarController, так как мне нужны определенные функции.Сам TabBar готов и работает, но я не совсем знаю, как отобразить ViewControllers в этом CustomTabBarViewController.

Предполагая, что у меня есть следующий метод:

func tabSelected(_ index: Int) {}

и знаниевысота моего TabBar до tabbar.frame.size, как мне создать два ViewController над TabBar и переключаться между ними при вызове метода tabSelected?Анимация перехода была бы еще приятнее, но на самом деле не нужна.

ПРИМЕЧАНИЕ: мой TabBar не наследуется от UITabBarController, только от обычного UIViewController, чтобы избежать дальнейшей путаницы.

Ответы [ 2 ]

0 голосов
/ 28 декабря 2018

Вот еще один подход:

1. В вашем CustomTabBarViewController определите массив для хранения контроллеров ViewControl:

var viewControllers: [UIViewController]

Создайте экземпляры контроллеров представления и добавьте ихв массив:

// If you're not using storyboard:
let homeViewController = HomeViewController()
// If using storyboard:
let searchViewController = storyboard.instantiateViewController(withIdentifier: "SearchViewController")

viewControllers = [homeViewController, searchViewController, ...]

2. Определить переменную для отслеживания выбранной кнопки вкладки:

var selectedIndex: Int = 0

3. Реализуйте свой tabSelected метод так.Я объяснил каждую строку в коде:

func tabSelected(_ index: Int) {
    let previousIndex = selectedIndex

    selectedIndex = index

    // Use previousIndex to access the previous ViewController from the viewControllers array.
    let previousVC = viewControllers[previousIndex]

    // Remove the previous ViewController
    previousVC.willMove(toParentViewController: nil)
    previousVC.view.removeFromSuperview()
    previousVC.removeFromParentViewController()

    // Use the selectedIndex to access the current ViewController from the viewControllers array.
    let vc = viewControllers[selectedIndex]

    // Add the new ViewController (Calls the viewWillAppear method of the ViewController you are adding)
    addChildViewController(vc)
    vc.view.frame = contentView.bounds

    // contentView is the main view above your tab buttons
    contentView.addSubview(vc.view)

    // Call the viewDidAppear method of the ViewController you are adding using didMove(toParentViewController: self)
    vc.didMove(toParentViewController: self)
}
0 голосов
/ 28 декабря 2018

Здесь я создал пример проекта: 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

...