Swift: обновление меток в представлении общего контейнера - PullRequest
1 голос
/ 01 февраля 2020

Контекст:

У меня есть три ViewController, которые совместно используют одно представление контейнера. ContainerViewController содержит переменную, которая будет изменена, например, банк.

У меня есть кнопка, которая добавляет 10000 в банк. Он добавляет 10000 к банку при нажатии, хотя он отображается, только если вы переходите на другую вкладку или возвращаетесь.

enter image description here


enter image description here

Я исследовал эту проблему и, похоже, понял что мне нужно использовать подготовить (для segue :), чтобы обновить его, но я не могу заставить его работать.

Проблема: Как я могу обновить вид контейнера (так как мне нужны дополнительные метки там в конечном итоге) немедленно, чтобы новое значение отображалось и отображалось на том же V C?

HomeViewController (с кнопкой)

class HomeViewController: UIViewController {

     @IBOutlet weak var containerView: UIView!

    override func viewDidLoad() {
        super.viewDidLoad()

    }

    @IBAction func bankButton(_ sender: Any) {

        bank += 10099
        print("\(bank)")
    }

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
       if segue.identifier == "container" {
        let vc = segue.destination as! ViewController

       }
       }

    }

}

ViewController (Container)

var bank = 10000;

class ViewController: UIViewController {


    @IBOutlet weak var cashLabel: UILabel!

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

    override func viewDidAppear(_ animated: Bool) {
        cashLabel.text = "\(bank)"
    }
}

1 Ответ

1 голос
/ 01 февраля 2020

есть много ответов, например, RxSwift может вам помочь, или что-то более простое, например Центр уведомлений. оба работают с наблюдателями, я надеюсь, что этот код поможет вам.

добавьте этот код в представление вашего контейнера

var bank = 10000
viewDidLoad(){
   NotificationCenter.default.addObserver(self, selector: #selector(updateLabel(_:)), name: NSNotification.Name(rawValue: "updateLabel"), object: nil)
}

@objc func updateLabel(_ notification: Notification){
    if let data = notification.object as? Int{
    bank += data
    cashLabel.text = "\(bank)"
    }
}

, теперь добавьте этот код в контроллер основного представления

@IBAction func bankButton(_ sender: Any) {
    bank += 10099
    print("\(bank)")
    NotificationCenter.default.post(name: NSNotification.Name(rawValue: "updateLabel"), object: bank)
}

Я рекомендую вам изучить RxSwift и объединить, последний работает только на iOS 13

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