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.
}
}