1

我正在使用 XLPagerTabStrip - https://github.com/xmartlabs/XLPagerTabStrip有两个共享相同数据集的选项卡。

对于数据集,在我的主视图(包含两个选项卡)中,我调用了 Firebase 来获取数据。收到后,我会拨打通知电话以发布数据 - > NB 我确信这不是最优雅的方式,所以如果有人对更好的方式有建议,请告诉我(尽管这本身就是一个单独的问题)。

无论如何 - 在这两个选项卡中,我都有此通知的观察者。

这在初始选项卡上效果很好,但是在用户点击选项卡之前第二个选项卡似乎没有初始化 - >出于内存原因是有意义的:)但这意味着 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,但如果它是唯一的方式(没有可怕的黑客攻击),我只会沿着这条路走

提前致谢!

4

2 回答 2

1

所以我设法让这个工作,但不完全确定这是否是最好的方法,所以会稍微开放一下

我所做的是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 :)
        }
    }
}
于 2018-07-31T15:40:02.417 回答
0

如您所知,XLpagertabstrip 像 UITabbarController 一样工作,这意味着您ButtonBarPagerTabStripViewController将两者都TabOneVC视为TabTwoVCchildViewControllers。所以在我看来,你应该访问两个 viewController 并在没有通知的情况下发送数据。

getData()因此,从您的方法访问您的两个 viewControllerButtonBarPagerTabStripViewController并发送数据。

对于您TabTwoVC在用户单击之前发送数据的问题,您可以在内部使用变量TabTwoVC并发送数据。并在ViewDidLoad第一次读取数据。

于 2018-07-31T15:01:13.600 回答