UITabBarController如何适应VIPER架构?

时间:2015-05-13 13:21:47

标签: ios viper-architecture

我正在编写一个具有基于TabBar的导航的应用程序。我正在采用VIPER架构,但我对如何实现UITabBarController选项卡更改的主题感到困惑。

3 个答案:

答案 0 :(得分:17)

这可能会迟到,但对其他人可能会有所帮助。 我的用例是在登录屏幕后实现tabBarController。 我们可以通过很多方式在VIPER中完成这项工作,但我如何做到如下:

  1. 手动分配TabBar,不使用故事板。
  2. 仅为TabBarWireframe演示创建新的WireFrame类。
  3. 创建一个包含一个可变数组的单例类,该数组将包含要分配给tabBarController的所有视图控制器。
  4. 创建一个json文件,它将为我提供选项卡的值,可以跳过此步骤,因为我希望选项卡基于来自JSON文件的值是动态的。如果您有静态标签,请跳过此步骤。
  5. 在TabBarWireframe中,添加一个调用所有选项卡线框的循环。
  6. 在您的各个线框中,只需实例化viewController obj并将其添加到我们在步骤3中创建的单例类数组中。
  7. 所有作为标签一部分的viewController都是数组的一部分。只需从loginviewcontroller实例中显示tabBar控制器(它的实例只是将方法传递给tabBarWireframe类)。
  8. 希望我有道理。

答案 1 :(得分:5)

使用VIPER架构实现UITabBarController的另一种方法是提供TabBarInterface

import Foundation
import UIKit

protocol TabBarInterface {
    func configuredViewController() -> UIViewController
}

因此,在标签栏控制器中显示视图控制器的每个线框都会实现TabBarInterface,然后installIntoWindow只会循环遍历所有线框,为每个线框调用configuredViewController。< / p>

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()

答案 2 :(得分:2)

我还是VIPER的新手,所以我的两分钱可能不值得多,但可能会将tabbar作为AppDelegate上的私人财产。当您需要更改为特定索引时,可以使用实用程序方法更改tabbar选择的索引,但也会触发线框/路由器创建过程。