【问题标题】:How a UITabBarController fit into the VIPER architecture?UITabBarController 如何适应 VIPER 架构?
【发布时间】:2015-07-24 19:39:33
【问题描述】:

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

【问题讨论】:

    标签: ios viper-architecture


    【解决方案1】:

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

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

    希望我说得通。

    【讨论】:

    • 我做了几乎一样的,但加1解释
    • 哦...很高兴听到:)
    • 但它是如何跟随毒蛇的?同样在我的情况下,我需要在 rootviewcontroller 级别上进行一些网络调用,该级别还必须托管标签栏
    【解决方案2】:

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

    【讨论】:

    • 我能把它作为 Github 上的代码模板示例吗?
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2018-01-28
      • 2018-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-26
      相关资源
      最近更新 更多