【问题标题】:Is it possible to set a coordinator property on a UITabBarController?是否可以在 UITabBarController 上设置协调器属性?
【发布时间】:2020-07-11 09:15:18
【问题描述】:

我正在尝试在基于选项卡的应用中实现滑出菜单。我有一个包含 MenuViewController 和 UITabBarController 的容器控制器,它符合 MasterDelegate 协议,该协议告诉容器在按下位于单个选项卡上的汉堡包按钮时滑出 MenuViewController。我的问题是 UITabBarController 的 coordinator 属性在配置 UITabBarController 之后才设置,因此 UITabBarController 中的属性以及包含按钮的选项卡的 ViewController 始终为零。

这是属于设置 UITabBarController 的容器的代码:

func configureHomeController() {

    centerController = MainTabBarController()

    // Make sure to set delegate of homeController
    centerController.masterDelegate = self

    print("MainContainterController: Setting the MainTabBarController delegate")

    if centerController.masterDelegate != nil {
    print("MainContainerController: MainTabBarController Delegate set")
    }

    view.addSubview(centerController.view)

    // Add the navigationController containing the HomeController as a child to the ContainerController
    addChild(centerController)

    // Home controller didMove to the parent container of self, which is the ContainerController
    centerController.didMove(toParent: self)
}

在 TabBarController 中,有一个在 TabBarController 配置后执行的打印语句,它告诉我 masterDelegate 属性是否为 nil。这是在容器控制器打印上述两个语句之前打印的。由于打印了第二条打印语句,我知道正在设置协调器,但是设置得太晚了。

我的问题是如何在 UITabBarController 配置完成之前设置 masterDelegate?或者有没有办法在事后设置该属性?

【问题讨论】:

    标签: ios swift uitabbarcontroller coordinator-pattern


    【解决方案1】:

    为您的 tabbarcontroller 创建一个方便的 init 并将委托传递给它。像这样的:

    convenience init(masterDelegate: MasterDelegate) {
        self.init(nibName: nil, bundle: nil)
    
        self.masterDelegate = masterDelegate
    }
    

    当你设置 TabBarController 时,像这样实例化它:

       centerController = MainTabBarController(masterDelegate: self)
       centerController.configure()
    

    另外,在 MainTabBarController 中创建一个配置函数。在那里,设置你的 viewControllers。

     (in MainTabBarController)
       func configure() {
           viewControllers = [viewController, viewController2, ....]
       }
    

    【讨论】:

    • 这不起作用,它仍然为零。我在便利初始化中添加的条件打印语句在 TabBarController 设置其视图和子 ViewController 之后打印,因此不会将其传递给适当的 VC。
    • 通过将便利初始化更改为指定初始化来解决。谢谢!
    • 您应该将 `func config()' 添加到 MainTabBarControler。在你初始化之后调用它,并在那里设置你的视图控制器。
    猜你喜欢
    • 2014-01-21
    • 2015-03-21
    • 1970-01-01
    • 2020-05-23
    • 1970-01-01
    • 2011-08-06
    • 1970-01-01
    • 1970-01-01
    • 2019-06-16
    相关资源
    最近更新 更多