我正在使用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来代替,但是我只会走这条路,除非它是唯一的方法(没有可怕的黑客手段)
谢谢!
答案 0 :(得分:0)
您知道XLpagertabstrip的工作方式类似于UITabbarController,这意味着您的ButtonBarPagerTabStripViewController
将TabOneVC
和TabTwoVC
都视为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 :)
}
}
}