从弹出窗口中显示自定义弹出窗口,然后关闭第一个弹出窗口会导致闪烁

时间:2018-12-10 22:27:28

标签: ios swift uiviewcontroller popup

当前,我创建一个自定义弹出窗口A,然后在按下其中的按钮时将其关闭,并在完成处理程序中创建一个新的弹出窗口B。

两个弹出窗口的相似之处在于,它们使用将alpha设置为值的黑色视图来模拟标准警报提供的变灰的屏幕效果。

但是,在创建B之前先消除A会导致闪烁。我想在解雇A之前先创建B,但是还没有找到一个好的方法。

如何做到这一点并避免闪烁的想法?

我正在考虑在显示弹出窗口A的视图控制器屏幕中放置带有alpha设置的黑色视图,并在显示弹出窗口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 :(得分:0)

不建议您采用这种方式,视图控制器不应考虑“解散自身”,然后“询问”另一个视图控制器以提供新的视图控制器。

我将使用来自PopupA的委托来与提供该对象的任何对象进行通信。该对象应该关闭PopupA视图控制器。

完成后,您可以尝试显示PopupB。