Swift Deeplink, чтобы открыть уже открытое приложение Viewcontroller?

У меня есть приложение, которое принимает URL-адрес Deeplink и открывает viewcontroller с переменными из ссылки, и оно хорошо работает, если приложение впервые открывается / запускается пользователем, использующим Deeplink.

Однако, если приложение уже открыто / или работает в фоновом режиме, и этот контроллер представления открыт... тогда он снова открывает тот же контроллер представления, поэтому у меня их два. Я не хочу открывать viewcontroller дополнительное время.

Есть ли какой-нибудь способ, которым я могу идентифицировать тот viewcontroller, который уже открыт, и передать ему переменные из Deeplink?

или мне нужно каким-то образом закрыть и снова открыть?

Я открыт для предложений.... заранее спасибо.

2 ответа

Вы можете найти видимый контроллер вида с помощью следующего метода

func getVisibleViewController(_ rootViewController: UIViewController?) -> UIViewController? {

    var rootVC = rootViewController
    if rootVC == nil {
        rootVC = UIApplication.shared.keyWindow?.rootViewController
    }

    if rootVC?.presentedViewController == nil {
        return rootVC
    }

    if let presented = rootVC?.presentedViewController {
        if presented.isKind(of: UINavigationController.self) {
            let navigationController = presented as! UINavigationController
            return navigationController.viewControllers.last!
        }

        if presented.isKind(of: UITabBarController.self) {
            let tabBarController = presented as! UITabBarController
            return tabBarController.selectedViewController!
        }

        return getVisibleViewController(presented)
    }
    return nil
}

Затем вы можете включить представленный вид

if let presentedView = getVisibleViewController(window?.rootViewController)  {
                        switch presentedView {
//code
default: 
//code
}
}

и, конечно, в коммутаторе присутствует контроллер вида, если он не тот, который вы хотите открыть.

Не нужно закрывать viewcontroller перед его открытием!

Попробуйте использовать UIApplication.shared.keyWindow?.rootViewController и тестирование, что это за класс. Например:

if let vc = UIApplication.shared.keyWindow?.rootViewController {
    if vc is SomeViewController {
        // Do something.
    }
}
Другие вопросы по тегам