使用 XLPagerTabStrip 在选项卡之间共享数据
Sharing data between tabs using XLPagerTabStrip
我正在使用 XLPagerTabStrip - https://github.com/xmartlabs/XLPagerTabStrip 有两个共享同一数据集的选项卡。
对于数据集,在我的主视图(包含两个选项卡)中,我调用了 Firebase 以获取数据。收到后,我对 post 数据 -> N.B 进行通知调用。我敢肯定这不是最优雅的方法,所以如果有人对更好的方法有建议,请告诉我(尽管这本身就是一个单独的问题)。
无论如何 - 在这两个选项卡中我都有此通知的观察员。
这在初始选项卡上效果很好,但是看起来第二个选项卡在用户点击选项卡之前不会初始化 -> 由于内存原因,这很有意义:)但这意味着 MainVC 中的 post 得到错过了...
如何让两个选项卡实质上使用来自 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
}
}
我想可能需要核心数据,但如果这是唯一的方法(没有可怕的黑客攻击),我只会走那条路
提前致谢!
如您所知,XLpagertabstrip 的工作方式类似于 UITabbarController,这意味着您的 ButtonBarPagerTabStripViewController
将 TabOneVC
和 TabTwoVC
都视为 childViewController。所以在我看来你应该访问两个 viewControllers 并在没有通知的情况下发送数据。
因此,从 ButtonBarPagerTabStripViewController
的 getData()
方法访问两个 viewController 并发送数据。
对于在用户单击之前将数据发送到 TabTwoVC
的问题,您可以在 TabTwoVC
中使用变量并发送数据。并在 ViewDidLoad
中第一次读取数据。
所以我设法让它工作,但不完全确定这是否是最好的方法,所以会稍微打开它
我所做的是 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 :)
}
}
}
我正在使用 XLPagerTabStrip - https://github.com/xmartlabs/XLPagerTabStrip 有两个共享同一数据集的选项卡。
对于数据集,在我的主视图(包含两个选项卡)中,我调用了 Firebase 以获取数据。收到后,我对 post 数据 -> N.B 进行通知调用。我敢肯定这不是最优雅的方法,所以如果有人对更好的方法有建议,请告诉我(尽管这本身就是一个单独的问题)。
无论如何 - 在这两个选项卡中我都有此通知的观察员。
这在初始选项卡上效果很好,但是看起来第二个选项卡在用户点击选项卡之前不会初始化 -> 由于内存原因,这很有意义:)但这意味着 MainVC 中的 post 得到错过了...
如何让两个选项卡实质上使用来自 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
}
}
我想可能需要核心数据,但如果这是唯一的方法(没有可怕的黑客攻击),我只会走那条路
提前致谢!
如您所知,XLpagertabstrip 的工作方式类似于 UITabbarController,这意味着您的 ButtonBarPagerTabStripViewController
将 TabOneVC
和 TabTwoVC
都视为 childViewController。所以在我看来你应该访问两个 viewControllers 并在没有通知的情况下发送数据。
因此,从 ButtonBarPagerTabStripViewController
的 getData()
方法访问两个 viewController 并发送数据。
对于在用户单击之前将数据发送到 TabTwoVC
的问题,您可以在 TabTwoVC
中使用变量并发送数据。并在 ViewDidLoad
中第一次读取数据。
所以我设法让它工作,但不完全确定这是否是最好的方法,所以会稍微打开它
我所做的是 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 :)
}
}
}