Передача данных между контроллерами представления вкладок - swift - PullRequest
0 голосов
/ 01 мая 2020

Есть 3 дочерних контроллера представления вкладок. В контроллерах представления есть метки как 0. Если число (0) меток увеличивается в любом контроллере представления, я хочу увеличить от других. Как я могу сделать эту передачу данных.

Mobile views

class tab1Controller: UIViewController {

    @IBOutlet weak var countLabel: UILabel!
     var count = ""
    override func viewDidLoad() {
        super.viewDidLoad()

        count = countLabel.text!
        UserDefaults.standard.set(count, forKey: "count")
        UserDefaults.standard.synchronize()

    }

class tab2Controller: UIViewController {

    @IBOutlet weak var countLabel2: UILabel!
    override func viewDidLoad() {
        super.viewDidLoad()

        countLabel2.text = UserDefaults.standard.string(forKey: "count")

    }

Я сделал что-то подобное, но это не сработало

Ответы [ 3 ]

1 голос
/ 01 мая 2020

Сделайте это в viewWillAppear () вместо viewDidLoad () .. Потому что DidLoad () всех контроллеров вызывается при создании tabBar и отображении первой вкладки ...

@IBOutlet weak var countLabel2: UILabel!
    override func viewWillAppear(_ animated: Bool) {
  super.viewWillAppear(animated)
  countLabel.text = UserDefaults.standard.string(forKey: "count")
}
0 голосов
/ 01 мая 2020

Я предполагаю, что ваши дочерние контроллеры создаются одновременно с созданием контроллера вкладок. В тех случаях, когда необходимо уведомить другие существующие контроллеры, вы должны использовать NotificationCenter .

Механизм рассылки уведомлений, позволяющий передавать информацию зарегистрированным наблюдателям.

extension Notification.Name {
    static let didReceiveCountData = Notification.Name("didReceiveCountData")
}

class tab1Controller: UIViewController {

     @IBOutlet weak var countLabel: UILabel!

     override func viewDidLoad() {
        super.viewDidLoad()

        // Listen notifications for name .didReceiveCountData.
        // onDidReceiveCountData(_:) will be called when notification received.
        NotificationCenter.default.addObserver(self, selector: #selector(onDidReceiveCountData(_:)), name: .didReceiveCountData, object: nil)

     }

    // This will be called when the count changes.
     @objc func onDidReceiveCountData(_ notification:Notification) {
        if let newCount = notification.object as? String {
            countLabel.text = newCount
        }
     }

    // Call this when you need to change count and notify other tabs.
    private func changeCount(_ newCount: String) {
        NotificationCenter.default.post(name: .didReceiveCountData, object: newCount)
    }
}

class tab2Controller: UIViewController {

     @IBOutlet weak var countLabel: UILabel!

     override func viewDidLoad() {
        super.viewDidLoad()

        // Listen notifications for name .didReceiveCountData.
        // onDidReceiveCountData(_:) will be called when notification received.
        NotificationCenter.default.addObserver(self, selector: #selector(onDidReceiveCountData(_:)), name: .didReceiveCountData, object: nil)

     }

    // This will be called when the count changes.
     @objc func onDidReceiveCountData(_ notification:Notification) {
        if let newCount = notification.object as? String {
            countLabel.text = newCount
        }
     }

    // Call this when you need to change count and notify other tabs.
    private func changeCount(_ newCount: String) {
        NotificationCenter.default.post(name: .didReceiveCountData, object: newCount)
    }
}
0 голосов
/ 01 мая 2020

Я думаю, что самый простой способ в вашем случае - обновить текст метки в методе viewWillAppear.

override func viewWillAppear(_ animated: Bool) {
  super.viewWillAppear(animated)
  countLabel.text = UserDefaults.standard.string(forKey: "count")
}

Вы также должны обновлять значение в UserDefaults каждый раз, когда число изменяется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...