Как UITabBarController вписывается в архитектуру VIPER?

Я пишу приложение с навигацией на основе TabBar. Я принимаю архитектуру VIPER, но меня действительно смущает тема того, как должно быть реализовано изменение вкладки UITabBarController.


person Tibor Molnár    schedule 13.05.2015    source источник


Ответы (3)


Это может быть поздно, но это может быть полезно для других. Мой вариант использования заключался в реализации tabBarController после экрана входа в систему. В VIPER это можно сделать разными способами, но я сделал это следующим образом:

  1. Выделил TabBar вручную, без использования раскадровки.
  2. Создайте новый класс WireFrame только для представления TabBarWireframe.
  3. Создайте одноэлементный класс с одним изменяемым массивом, который будет содержать все контроллеры представления, которые будут назначены tabBarController.
  4. Создайте файл json, который предоставит мне значения вкладок. Этот шаг можно пропустить, так как я хотел, чтобы вкладки были динамическими на основе значения из файла JSON. Если у вас есть статические вкладки, пропустите этот шаг.
  5. В TabBarWireframe поместите цикл, который вызовет каркасы всех ваших вкладок.
  6. В ваших отдельных каркасах просто создайте экземпляр объекта viewController и добавьте его в массив одноэлементных классов, который мы создали на шаге 3.
  7. Ведь viewController, которые являются частью вкладок, являются частью массива. Просто представьте контроллер tabBar из экземпляра loginviewcontroller (его экземпляр просто проходит через метод в класс tabBarWireframe).

Надеюсь, я имел смысл.

person Maddiee    schedule 04.09.2015
comment
Я сделал почти так же, но плюс 1 за объяснение - person Tibor Molnár; 04.09.2015
comment
ооо...приятно слышать :) - person Maddiee; 04.09.2015
comment
но как это следует за гадюкой? также в моем случае мне нужно сделать какой-то сетевой вызов на уровне rootviewcontroller, который также должен содержать панель вкладок - person Akhil Dad; 05.09.2017

Еще один способ реализовать UITabBarController с архитектурой VIPER — предоставить TabBarInterface

import Foundation
import UIKit

protocol TabBarInterface {
    func configuredViewController() -> UIViewController
}

Таким образом, каждый каркас, представляющий контроллер представления в контроллере панели вкладок, реализует TabBarInterface, а затем installIntoWindow просто перебирает все каркасы, вызывая configuredViewController для каждого представленного каркаса.

import Foundation

import UIKit

class TabBarWireframe : NSObject {

    let wireFrames:[TabBarInterface]
    var rootWireframe : RootWireframe?

    init(_ wireFrames:TabBarInterface...) {
        self.wireFrames = wireFrames
        super.init()
    }

    private override init() {
        self.wireFrames = [TabBarInterface]()
    }

    func installIntoWindow(window: UIWindow) {
        let tabBarController = MainTabBarController()

        var viewControllers = [UIViewController]()

        for wireFrame in wireFrames {
            viewControllers.append(wireFrame.configuredViewController())
        }

        tabBarController.viewControllers = viewControllers
        tabBarController.navigationItem.title = "Visva"

        self.rootWireframe?.installTabBarControllerIntoWindow(tabBarController: tabBarController, window: window)
    }

}

Обратите внимание, что в нашем случае RootWireframe устанавливает контроллер панели вкладок в основное окно, т.е.:

window.rootViewController = tabBarController
window.makeKeyAndVisible()
person Sei Flavius    schedule 07.06.2016
comment
Могу ли я получить это как пример шаблона кода на Github или что-то в этом роде? - person HeiN; 12.10.2017

Я все еще новичок в VIPER, поэтому мои два цента могут не стоить многого, но, возможно, панель вкладок является частной собственностью в AppDelegate. Когда вам нужно перейти на определенный индекс, используйте служебные методы, которые изменяют выбранный индекс на панели вкладок, но также запускают процесс создания каркаса/маршрутизатора.

person bennythemink    schedule 19.05.2015