Swift / iOS13 - UIApplication.shared.delegate.window? .RootViewController? .Present () из пользовательского класса - PullRequest
1 голос
/ 25 октября 2019

Я создал новый Проект раскадровки в Xcode11 и пытаюсь представить ViewController из пользовательского класса , как это (что прекрасно работает в старом проекте):

let appDelegate = UIApplication.shared.delegate as! AppDelegate
let storyboard : UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
let vc : UIViewController = storyboard.instantiateViewController(withIdentifier: "NotificationVC") as UIViewController
appDelegate.window?.makeKeyAndVisible()
appDelegate.window?.rootViewController?.present(vc, animated: true, completion: nil)

Конечно, теперь это не работает, потому что в AppDelegate больше нет оконной переменной, которая была бы перемещена в SceneDelegate.

Ошибка: Value of type 'AppDelegate' has no member 'window'

Как бы вы заставили этот код работать сейчас?

Что я пытаюсь сделать:

Я пытаюсь показать ViewController, когда пользователь нажимает / нажимает на лоток push-уведомлений.

РЕДАКТИРОВАТЬ: На данный момент я смог заставить его работать, создав частную статическую переменную в SceneDelegate и получив доступ к этой переменной в моем пользовательском классе:

SceneDelegate.swift

private(set) static var shared: SceneDelegate?
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {

    guard let _ = (scene as? UIWindowScene) else { return }
    Self.shared = self
}

CustomClass.swift

let sceneDeleage = SceneDelegate.shared
let storyboard : UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
let vc : UIViewController = storyboard.instantiateViewController(withIdentifier: "NotificationVC") as UIViewController
sceneDeleage?.window?.makeKeyAndVisible()
sceneDeleage?.window?.rootViewController?.present(vc, animated: true, completion: nil)

Что, вероятно, не рекомендуется, как указано здесь: https://stackoverflow.com/a/58547992/9511942,, но работает

РЕДАКТИРОВАТЬ 2: Вот еще одно мое решение благодаря https://stackoverflow.com/a/58557634/9511942

    let window = UIApplication.shared.windows.first
    let storyboard : UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
    let vc : UIViewController = storyboard.instantiateViewController(withIdentifier: "NotificationVC") as UIViewController
    window?.makeKeyAndVisible()
    window?.rootViewController = vc

Если кто-то найдет лучшее решение, пожалуйста, поделитесь.

1 Ответ

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

Используйте свойство UIApplication.shared.windows для получения Приложения Windows. Пожалуйста, обратитесь https://developer.apple.com/documentation/uikit/uiapplication/1623104-windows

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