Представление пользовательского всплывающего окна из всплывающего окна, а затем отклонение первого всплывающего окна вызывает мерцание - PullRequest
0 голосов
/ 11 декабря 2018

В настоящее время я создаю собственное всплывающее окно A, а затем при нажатии кнопки в нем закрывает его, а в обработчике завершения создает новое всплывающее окно B.

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

Однако отклонение A перед созданием B вызывает мерцание.Я хотел бы создать B, прежде чем уволить A, но не нашел хорошего способа сделать это.

Идеи о том, как это сделать и избежать мерцания?

Я думаю поставитьчерный вид с установленным альфа на экране контроллера вида, который показывает всплывающее окно A и включает его, когда отображается всплывающее окно A, и выключается, когда всплывающее окно B закрывается.Однако это не кажется лучшим решением.Другим способом было бы иметь одно всплывающее окно и показывать скрытые элементы управления, но это тоже не очень хорошее решение, потому что это делает грязный VC беспорядочным.

Вот как теперь выглядит код:

Изменю создается всплывающее окно A:

let storyBoard = UIStoryboard(name: "MenuStoryboard", bundle: nil)
let aPopup = storyBoard.instantiateViewController(withIdentifier: "Popup_A")

present(aPopup, animated: false, completion: nil)

Затем из действия кнопки всплывающего окна A:

self.dismiss(animated: false) {
let storyBoard = UIStoryboard(name: "MenuStoryboard", bundle: nil)
let bPopup = storyBoard.instantiateViewController(withIdentifier: "PopUp_B")

        if let topViewController = UIApplication.shared.topMostViewController {
            topViewController.present(bPopup, animated: false, completion: nil)
        }
    }

и расширения:

 extension UIViewController {
    var topMostViewController : UIViewController {

        if let presented = self.presentedViewController {
            return presented.topMostViewController
        }

        if let navigation = self as? UINavigationController {
            return navigation.visibleViewController?.topMostViewController ?? navigation
        }

        if let tab = self as? UITabBarController {
            return tab.selectedViewController?.topMostViewController ?? tab
        }

        return self
    }
}

extension UIApplication {
    var topMostViewController : UIViewController? {
        return self.keyWindow?.rootViewController?.topMostViewController
    }
}

1 Ответ

0 голосов
/ 11 декабря 2018

То, что вы делаете, не рекомендуется, View Controller не должен беспокоиться о «отклонении себя» и последующем «запросе» другого контроллера представления представить новый контроллер представления.

Я бы использовал делегирование отPopupA, чтобы связаться с тем объектом, который представилЭтот объект ДОЛЖЕН отклонить контроллер представления PopupA.

После завершения вы можете попытаться отобразить PopupB.

...