Zev Eisenberg의 대답은 간단하고 간단하지만 항상 작동하지는 않으며 다음 경고 메시지와 함께 실패 할 수 있습니다.
Warning: Attempt to present <UIAlertController: 0x7fe6fd951e10>
on <ThisViewController: 0x7fe6fb409480> which is already presenting
<AnotherViewController: 0x7fe6fd109c00>
Windows rootViewController가 제시된보기의 맨 위에 있지 않기 때문입니다. 이 문제를 해결하려면 Swift 3으로 작성된 UIAlertController 확장 코드에 표시된대로 프레젠테이션 체인을 따라야합니다.
/// show the alert in a view controller if specified; otherwise show from window's root pree
func show(inViewController: UIViewController?) {
if let vc = inViewController {
vc.present(self, animated: true, completion: nil)
} else {
// find the root, then walk up the chain
var viewController = UIApplication.shared.keyWindow?.rootViewController
var presentedVC = viewController?.presentedViewController
while presentedVC != nil {
viewController = presentedVC
presentedVC = viewController?.presentedViewController
}
// now we present
viewController?.present(self, animated: true, completion: nil)
}
}
func show() {
show(inViewController: nil)
}
2017 년 9 월 15 일 업데이트 :
위의 논리가 새로 사용 가능한 iOS 11 GM 시드에서 여전히 잘 작동하는지 테스트하고 확인했습니다. 그러나 민첩성 비전에 의해 가장 많이 투표 된 방법은 그렇지 않습니다 UIWindow
. iOS 11에서는 키보드 창의 레벨보다 높은 모든 윈도우 레벨이 그 아래 레벨로 낮아지기 때문입니다.
에서 제시 한 유물 keyWindow
하지만 키보드의 애니메이션이 경고가 발표 될 때 아래로 슬라이딩 및 경보를 해제 할 때 다시 슬라이딩입니다. 프리젠 테이션 중에 키보드를 그대로 두려면 아래 코드와 같이 상단 창 자체에서 프리젠 테이션을 시도 할 수 있습니다.
func show(inViewController: UIViewController?) {
if let vc = inViewController {
vc.present(self, animated: true, completion: nil)
} else {
// get a "solid" window with the highest level
let alertWindow = UIApplication.shared.windows.filter { $0.tintColor != nil || $0.className() == "UIRemoteKeyboardWindow" }.sorted(by: { (w1, w2) -> Bool in
return w1.windowLevel < w2.windowLevel
}).last
// save the top window's tint color
let savedTintColor = alertWindow?.tintColor
alertWindow?.tintColor = UIApplication.shared.keyWindow?.tintColor
// walk up the presentation tree
var viewController = alertWindow?.rootViewController
while viewController?.presentedViewController != nil {
viewController = viewController?.presentedViewController
}
viewController?.present(self, animated: true, completion: nil)
// restore the top window's tint color
if let tintColor = savedTintColor {
alertWindow?.tintColor = tintColor
}
}
}
위의 코드에서 유일하지 않은 부분은 클래스 이름 UIRemoteKeyboardWindow
을 검사하여 클래스 이름도 포함 시킬 수 있는지 확인하는 것입니다. 그럼에도 불구하고 위의 코드는 올바른 색조 색상과 키보드 슬라이딩 아티팩트가없는 iOS 9, 10 및 11 GM 시드에서 훌륭하게 작동합니다.