Отправка данных в контроллер при переключении вкладок - PullRequest
1 голос
/ 30 марта 2019

Мое приложение имеет 4 вкладки. На 4-й вкладке есть опция «Войти» в приложение, которая переводит пользователя в контроллер входа. Когда пользователь входит в систему, я хочу переключить пользователя обратно на 1-ю вкладку, что я делаю с помощью следующего кода:

self.tabBarController?.selectedIndex = 0

Однако я хочу обновить содержимое на 1-й вкладке после того, как пользователь вошел в систему (поскольку содержимое зависит от пользователя). Это означает, что мне нужно передать некоторые данные, когда пользователь переключает вкладки, чтобы контроллер на 1-й вкладке знал, что нужно обновить данные.

Как отправить данные на 1-ю вкладку при переключении между вкладками для обновления содержимого? Или есть лучший способ обойти это?

Ответы [ 3 ]

1 голос
/ 31 марта 2019

enter image description here enter image description here

Вы можете сделать это, используя уведомление / наблюдателя или шаблон делегата.

Поскольку это, похоже, отношение один к одному, вам, вероятно, следует использовать шаблон делегата, поскольку уведомление и наблюдатель используются для отношений один ко многим.

  1. Создайте протокол прямо над кодом контроллера вашего 4-го представления. Параметрами этой функции будут данные, которые вы будете передавать из одного ViewController в другой. В этом примере я передаю текст textField, где пользователь может поставить его имя:

    protocol SelectionDelegate {
        func didTapChoice(name: String)
    }
    
  2. Добавьте переменную делегата в контроллере представления 4-й вкладки:

    var selectionDelegate: SelectionDelegate!
    
  3. Вызовите функцию переменной-делегата в @IBAction:

    selectionDelegate.didTapChoice(name: textField.text!)
    tabBarController?.selectedIndex = 0
    
  4. Назначьте делегата выбора 1-му контроллеру представления в viewDidLoad () 2-го контроллера представления:

    selectionDelegate = tabBarController?.viewControllers?[0] as? SelectionDelegate
    
  5. Добавьте расширение внизу контроллера 1-й вкладки, реализующего функцию протокола:

    extension FirstTabViewController: SelectionDelegate {
        func didTapChoice(name: String) {
            displayLabel.text = name
        }
    }
    

Вот результат для первого контроллера представления:

import UIKit

class FirstTabViewController: UIViewController {

    @IBOutlet weak var displayLabel: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()
    }
}

extension FirstTabViewController: SelectionDelegate {
    func didTapChoice(name: String) {
        displayLabel.text = name
    }
}

Вот результат для второго контроллера представления:

import UIKit

protocol SelectionDelegate {
    func didTapChoice(name: String)
}

class SecondTabViewController: UIViewController {
    var selectionDelegate: SelectionDelegate!

    @IBOutlet weak var textField: UITextField!

    @IBAction func goToFirstTabButtonTapped(_ sender: UIButton) {
        selectionDelegate.didTapChoice(name: textField.text!)
        tabBarController?.selectedIndex = 0
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        selectionDelegate = tabBarController?.viewControllers?[0] as? SelectionDelegate
    }
}
0 голосов
/ 31 марта 2019
  1. В первый ВК .прослушать логин уведомление.
  2. В Логин VC .Когда пользователь вошел в систему.опубликовать логин уведомление.
0 голосов
/ 31 марта 2019

Напишите метод в контроллере представления вашей первой вкладки (скажем, yourCustomMethod () ), затем вы можете получить доступ к этому методу из контроллера представления четвертой вкладки, используя: -

    if let navigationController = self.tabBarController?.childViewControllers[0],
        let firstVC = navigationController.childViewControllers[0] as? FlightsHomeViewController {

        let yourData = ["username": "something"]
        firstVC.yourCustomMethod(data: yourData)
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...