Как обновить sh ViewController после вызова метода dismiss - PullRequest
0 голосов
/ 03 февраля 2020

Например, у меня есть два viewController с именами A и B. Я перехожу к «B view controller» после вызова существующего метода. Я устанавливаю некоторые значения через UserDefaults.stnadard на «B viewController», и я возвращаюсь к «Контроллеру представления» после вызова метода dismiss. «ViewController» должен показывать измененные значения, но он не показывает измененные. Я попытался вызвать метод viewDidAppear() для "ViewController", но он не сработал. Я пытался вызвать метод viewDidLoad(), и он работал хорошо, но я слышал, что это не очень хороший способ вызвать метод напрямую. Система может только назвать это. Так что я не хочу называть это сам. Как мне перефразировать sh «Контроллер представления»?

Ответы [ 2 ]

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

С iOS 13.0 и выше Apple изменила способ представления контроллеров представления по умолчанию. Таким образом, viewWillAppear в ViewControllerA не будет вызываться после исчезновения ViewControllerB.

Один способ убедиться, что метод viewWillAppear будет вызван после закрытия ViewControllerB, представляет параметр viewController modalPresentationStyle для fullScreen как:

let vc = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(identifier: "ViewControllerB") as! ViewControllerB
vc.modalPresentationStyle = .fullScreen
self.present(vc, animated: true, completion: nil)

Пример кода:

ViewControllerA.swift

class ViewControllerA: UIViewController {

    private var username: String? {
        UserDefaults.standard.string(forKey: "USERNAME")
    }

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

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        print(username) //set this to desired view
    }

    @IBAction func goToViewControllerB(_ sender: UIButton) {
        let vc = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(identifier: "ViewControllerB") as! ViewControllerB
        vc.modalPresentationStyle = .fullScreen
        self.present(vc, animated: true, completion: nil)
    }
}

ViewControllerB.swift

class ViewControllerB: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        UserDefaults.standard.set("John", forKey: "USERNAME")
    }

    @IBAction func dismiss(_ sender: Any) {
        self.dismiss(animated: true, completion: nil)
    }
}

Если вы не хотите изменять modalPresentationStyle на fullScreen, то вы можете использовать замыкания для передачи данных в ViewControllerA при отклонении ViewControllerB.

0 голосов
/ 03 февраля 2020

Я думаю, что NotificationCenter или прототип помогут это сделать.

Пример NotificationCenter

class ViewControllerA: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        NotificationCenter.default.addObserver(self, selector: #selector(testFunc), name: NSNotification.Name(rawValue:  "PeformAfterPresenting"), object: nil)

    }

    @objc func testFunc() {
      //TODO: your task
    }
}

class ViewControllerB: UIViewController {

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

@IBAction func dismiss(_ sender: Any) {

    NotificationCenter.default.post(name: "PeformAfterPresenting"), object: nil, userInfo: dataDict)

        self.dismiss(animated: true, completion: nil)
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...