Как использовать новый делегат сцены в Xcode - PullRequest
0 голосов
/ 24 октября 2019

Я пытаюсь изменить текст метки или показать предупреждение, когда мое приложение для iOS становится активным из фонового состояния.

Когда я вызываю функцию в классе ViewController, только метод print () работает нормально,Но когда я хочу взаимодействовать с объектами в этом классе, он показывает ошибки.

SceneDelegate.swift:

var vc = ViewController()

func sceneDidBecomeActive(_ scene: UIScene) {
    // Called when the scene has moved from an inactive state to an active state.
    // Use this method to restart any tasks that were paused (or not yet started) when the scene was inactive.

    vc.showMessage("Test message")
}

ViewController.swift:

@IBOutlet weak var textLabel: UILabel!

func showMessage(_ incomingMessage:String!) {
    let warning = UIAlertController(title: "Warning", message: incomingMessage, preferredStyle: .alert)
    let aButton = UIAlertAction(title: "OK", style: .cancel, handler: nil)
    warning.addAction(aButton)

    self.present(warning, animated: true)

    textLabel.text = incomingMessage

    print("message is : " + incomingMessage)
}

1 Ответ

0 голосов
/ 24 октября 2019

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

В делегате сцены удалитесоздание ViewController и попытка вызвать showMessage.

Затем обновите свой класс ViewController. Добавьте следующее к viewDidLoad:

NotificationCenter.default.addObserver(self, selector: #selector(didActivate), name: UIScene.didActivateNotification, object: nil)

Затем добавьте метод didActivate:

func didActivate() {
    showMessage("Test Message")
}

И затем добавьте deinit:

deinit {
    NotificationCenter.default.removeObserver(self)
}

Таким образом, только контроллер представления должен знать логику того, что ему нужно делать и когда.

Также обратите внимание, что если вы действительно хотите определить, когда сцена возвращается с фона (выходит на передний план), тогда используйтеwillEnterForegroundNotification уведомление вместо didActivateNotification.

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