当前,我创建一个自定义弹出窗口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
}
}
答案 0 :(得分:0)
不建议您采用这种方式,视图控制器不应考虑“解散自身”,然后“询问”另一个视图控制器以提供新的视图控制器。
我将使用来自PopupA的委托来与提供该对象的任何对象进行通信。该对象应该关闭PopupA视图控制器。
完成后,您可以尝试显示PopupB。