জেভ আইজেনবার্গের উত্তরটি সহজ এবং সোজাসাপ্টা, তবে এটি সর্বদা কার্যকর হয় না এবং এই সতর্কতা বার্তায় এটি ব্যর্থ হতে পারে:
Warning: Attempt to present <UIAlertController: 0x7fe6fd951e10>
on <ThisViewController: 0x7fe6fb409480> which is already presenting
<AnotherViewController: 0x7fe6fd109c00>
এটি কারণ উইন্ডোজ রুটভিউ কনট্রোলার উপস্থাপিত দর্শনের শীর্ষে নেই। এটি সংশোধন করার জন্য আমাদের উপস্থাপনা শৃঙ্খলা চালিয়ে যাওয়া দরকার, যেমনটি আমার ইউআইএআরএলআর্ট কন্ট্রোলার এক্সটেনশন কোডে সুইফট 3 তে লিখিত হয়েছে:
/// 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 এ আপডেট হয়েছে:
পরীক্ষিত এবং নিশ্চিত করা হয়েছে যে উপরের যুক্তিটি সদ্য উপলভ্য আইওএস 11 জিএম বীজে দুর্দান্ত কাজ করে। তত্পরতা সহ শীর্ষে ভোট দেওয়া পদ্ধতিটি অবশ্য তা করে না: সদ্য সতর্কতার মধ্যে উপস্থিত সতর্কতা দর্শনUIWindow
কীবোর্ডের নীচে এবং সম্ভাব্যরূপে ব্যবহারকারীকে তার বোতামগুলি ট্যাপ করা থেকে বিরত করে। এটি কারণ হ'ল আইওএস 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 জিএম বীজে ডান টিন্ট রঙের সাথে এবং কীবোর্ড স্লাইডিং আর্টফ্যাক্ট ছাড়াই দুর্দান্ত কাজ করে।