使用XLPagerTabStrip在标签之间共享数据

时间:2018-07-31 14:27:58

标签: ios swift firebase xlpagertabstrip

我正在使用XLPagerTabStrip-https://github.com/xmartlabs/XLPagerTabStrip具有两个共享同一数据集的标签。

对于数据集,在主视图(包含两个选项卡)中,我调用了Firebase以获取数据。收到通知后,我会发出通知电话以发布数据-> N.B.我确信这不是最优雅的方法,因此,如果有人对更好的方法有建议,请让我知道(尽管那是一个单独的问题)。

无论如何-在两个标签中,我都有该通知的观察者。

这在初始选项卡上很好用,但是似乎第二个选项卡直到用户点击选项卡后才初始化->由于内存原因才有意义:)但这意味着MainVC中的帖子被遗漏了... >

如何从Firebase调用中获得两个选项卡以实质上使用同一数据集?

我的高级代码如下(如果需要,我可以添加更多详细信息,让我知道丢失了什么):

class MainVC: ButtonBarPagerTabStripViewController {
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        getData()
    }

    fileprivate func getData() {
        // ... bunch of firebase stuff...

        NotificationCenter.default.post(
            name: NSNotification.Name(rawValue: "dataReceived"),
            object: nil,
            userInfo: ["data": data]
        )
    }

    override func viewControllers(for pagerTabStripController: PagerTabStripViewController) -> [UIViewController] {
        let tab_one = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "tab_one")

        let tab_two = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "tab_two")

        return [tab_one, tab_two]
    }
}

class TabOneVC: UIViewController, IndicatorInfoProvider {

    override func viewDidLoad() {
        super.viewDidLoad()

        print("Hello from Tab One")

        NotificationCenter.default.addObserver(
          self,
          selector: #selector(dataReceivedHandler(notfication:)),
          name: NSNotification.Name(rawValue: "dataReceived"),
          object: nil
        )
    }

    @objc func dataReceivedHandler(notfication: NSNotification) {
        // ... process data received
    }
}

class TabTwoVC: UIViewController, IndicatorInfoProvider {

    override func viewDidLoad() {
        super.viewDidLoad()

        print("Hello from Tab Two")

        ... same notification code as per Tab One 
    }
}

我想可能需要Core Data来代替,但是我只会走这条路,除非它是唯一的方法(没有可怕的黑客手段)

谢谢!

2 个答案:

答案 0 :(得分:0)

您知道XLpagertabstrip的工作方式类似于UITabbarController,这意味着您的ButtonBarPagerTabStripViewControllerTabOneVCTabTwoVC都视为childViewControllers。因此,我认为您应该同时访问两个viewControllers并发送没有Notification的数据。

因此,可以从getData()的{​​{1}}方法访问两个viewControllers并发送数据。

对于您在用户单击之前将数据发送到ButtonBarPagerTabStripViewController的问题,您可以使用TabTwoVC内部的变量来发送数据。并在TabTwoVC中首次读取数据。

答案 1 :(得分:0)

所以我设法使它正常工作,但不能完全确定这是否是最好的方法,所以请稍等片刻

我要做的是让MainVC重新加载视图

Tab VC在MainVC中都共享相同的数据属性-这就是我认为您建议的Ajay ...

class MainVC: ButtonBarPagerTabStripViewController {

    var data: [DataModel] = []

    fileprivate func getData() {
        // ... bunch of firebase stuff...

        // assign the data
        self.data = data

        // reload the view now we have data 
        // (doubt this is good practice...)
        self.reloadPagerTabStripView()
    }
}

两个标签都像这样从MainVC获取数据...

class TabOneVC: UIViewController, IndicatorInfoProvider {
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)

        // Get data in MainVC
        if let mainVC = self.parent as? MainVC {
            data = mainVC.data // woohoo :)
        }
    }
}