17

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

4

3 回答 3

17

这可能会迟到,但可能对其他人有帮助。我的用例是在登录屏幕之后实现 tabBarController。在 VIPER 中有很多方法可以做到这一点,但我是如何做到的:

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

希望我说得通。

于 2015-09-04T19:25:14.513 回答
7

用 VIPER 架构实现的另一种方法UITabBarController是提供一个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()
于 2016-06-07T22:22:55.120 回答
2

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

于 2015-05-19T06:34:50.200 回答