天天看點

去除掉螢幕上所有的UIAlertView

在 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 中找到這樣一篇說明:

去除掉螢幕上所有的UIAlertView

大概的意思是,在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>

繼續閱讀