Обмен данными между вкладками с помощью XLPagerTabStrip

Я использую XLPagerTabStrip - https://github.com/xmartlabs/XLPagerTabStrip чтобы иметь две вкладки, которые используют один и тот же набор данных.

Что касается набора данных, в моем главном окне (на котором расположены две вкладки) у меня есть вызов Firebase для получения данных. Получив сообщение, я отправляю уведомление, чтобы опубликовать данные -> NB. Я уверен, что это не самый элегантный способ сделать это, поэтому, если у кого-то есть предложения по лучшему способу, пожалуйста, дайте мне знать (хотя это отдельный вопрос сам по себе)).

Во всяком случае - в обеих вкладках у меня есть наблюдатели для этого уведомления.

Это прекрасно работает на начальной вкладке, однако кажется, что 2-я вкладка не инициализируется, пока пользователь не нажмет на вкладку -> имеет смысл по причинам памяти:) Но это означает, что сообщение в 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 ответа

Таким образом, мне удалось заставить это работать, но я не был полностью уверен, что это лучший способ, поэтому оставлю это открытым на некоторое время.

Что я сделал, так это чтобы MainVC перезагрузить вид

Вкладки 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 работает как UITabbarController, значит, ваш ButtonBarPagerTabStripViewController относиться к вам обоим TabOneVC а также TabTwoVC как childViewControllers. так что, по моему мнению, вы должны получить доступ к viewControllers и отправлять данные без уведомления.

Так что получите доступ к вашим обоим viewControllers из getData() метод вашего ButtonBarPagerTabStripViewController и отправьте данные.

для вашей проблемы отправки данных в TabTwoVC прежде чем пользователь нажмет на это, вы можете использовать переменную внутри TabTwoVC и отправить данные. И в ViewDidLoad прочитайте данные в первый раз.

Другие вопросы по тегам