在 iOS 7 系統之前, AlertVIew 顯示的原理是在螢幕上家裡一層 Alertwindow , 然後AlertView 的視圖加在了這個Window 上,是以可以通過擷取window上的視圖進而擷取UIAlertView 然後令其消失,具體代碼:
for (UIWindow* w in [UIApplication sharedApplication].windows)
for (NSObject* o in w.subviews)
if ([o isKindOfClass:[UIAlertView class]])
[(UIAlertView*)o dismissWithClickedButtonIndex:[(UIAlertView*)o cancelButtonIndex] animated:YES];
}
}
}
但是在iOS 7 上,這種方法就不起作用,因為顯示的機制不同了,在Stack Overflow 中找到這樣一篇說明:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiclRnblN0LclHdpZXYyd2LcBzNvwVZ2x2bzNXak9CX90TQNNkRrFlQKBTSvwFbslmZvwFMwQzLcVmepNHdu9mZvwFVywUNMZTY18CX052bm9CX90TQNVTTU9ENnRUT4FEVkZXUYpVd1kmYr50MZV3YyI2cKJDT29GRjBjUIF2LcRHelR3LcJzLctmch1mclRXY39jNwQTM0cTNwETOxEDM0EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
大概的意思是,在iOS 7 中,UIAlertView 的 window 并不是顯示在[UIApplication shareApplication].windows 中,而是被加入到了[UIApplication keyWindow] 中,但是并沒有留出引用或者說指針,是以我們沒有辦法擷取到;
是以在iOS 7 中,如果要使用如果要實作這個功能,就要在[alert show ] 的時候保留一份UIAlertView 的指針,在需要收到令其消失的地方,統一用保留的副本指針調用 dismissWithClickedButtonIndex ;可以通過繼承UIAlertView 然後重寫show 方法 或者 在 類别的擴充中重寫 show ,在此就不詳細說明了!
或者還有另一種方法
<span style="font-size:14px;">Class UIAlertManager = objc_getClass("_UIAlertManager");
UIAlertView *topAlertView = [UIAlertManager performSelector:@selector(topMostAlert)];
[topAlertView dismissWithClickedButtonIndex:0 animated:YES];</span>
使用前要引用 #import<objc/runtime.h>