ज़ेव ईसेनबर्ग का जवाब सरल और सीधा है, लेकिन यह हमेशा काम नहीं करता है, और यह इस चेतावनी संदेश के साथ विफल हो सकता है:
Warning: Attempt to present <UIAlertController: 0x7fe6fd951e10>
on <ThisViewController: 0x7fe6fb409480> which is already presenting
<AnotherViewController: 0x7fe6fd109c00>
ऐसा इसलिए है क्योंकि विंडोज़ rootViewController प्रस्तुत विचारों के शीर्ष पर नहीं है। इसे ठीक करने के लिए हमें प्रस्तुति श्रृंखला को चलाने की जरूरत है, जैसा कि स्विफ्ट 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)
}
9/15/2017 को अपडेट:
परीक्षण किया और पुष्टि की कि उपरोक्त तर्क अभी भी नए उपलब्ध iOS 11 जीएम बीज में महान काम करता है। चपलता द्वारा शीर्ष मतदान पद्धति, हालांकि, यह नहीं है: एक नए खनन में प्रस्तुत किया गया सतर्क दृश्य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
सुनिश्चित करने के लिए वर्ग नाम की जांच करता है कि हम इसे भी शामिल कर सकते हैं। फिर भी उपरोक्त कोड आईओएस 9, 10 और 11 जीएम बीज में, सही टिंट रंग के साथ और कीबोर्ड स्लाइडिंग कलाकृतियों के बिना शानदार काम करता है।