在我的iOS應用程序中,我有一個定時器啓動,當它觸發時,我需要能夠檢測是否有Alert(UIAlertView)或Action Sheet(UIActionSheet )打開。iPhone:檢測UIAlert/UIActionSheet是否打開
一種方法是修改提供警報/動作表的代碼 - 但不幸的是,在我的情況下,這不是一個選項。
所以,問題是 - 是否有方法知道/檢測警報或操作表是否已打開?
打開時是否發送任何通知,或者是否有任何遍歷視圖層次結構來檢測它?
感謝
在我的iOS應用程序中,我有一個定時器啓動,當它觸發時,我需要能夠檢測是否有Alert(UIAlertView)或Action Sheet(UIActionSheet )打開。iPhone:檢測UIAlert/UIActionSheet是否打開
一種方法是修改提供警報/動作表的代碼 - 但不幸的是,在我的情況下,這不是一個選項。
所以,問題是 - 是否有方法知道/檢測警報或操作表是否已打開?
打開時是否發送任何通知,或者是否有任何遍歷視圖層次結構來檢測它?
感謝
他們這樣做時,他們打開發送警報,但只有他們delegate
- 檢查this question一個不錯的方法,它的問題。 Techzen建議您在打開警報時將布爾標誌設置爲YES
,並在關閉警報時將其設置回NO
。
編輯:
因爲你沒有在所有訪問代碼,爲什麼不試試這個笨重的一段代碼:
-(BOOL) doesAlertViewExist {
for (UIWindow* window in [UIApplication sharedApplication].windows) {
NSArray* subviews = window.subviews;
if ([subviews count] > 0) {
BOOL alert = [[subviews objectAtIndex:0] isKindOfClass:[UIAlertView class]];
BOOL action = [[subviews objectAtIndex:0] isKindOfClass:[UIActionSheet class]];
if (alert || action)
return YES;
}
}
return NO;
}
- (BOOL) doesAlertViewExist {
for (UIWindow* window in [UIApplication sharedApplication].windows) {
for (UIView* view in window.subviews) {
BOOL alert = [view isKindOfClass:[UIAlertView class]];
BOOL action = [view isKindOfClass:[UIActionSheet class]];
if (alert || action)
return YES;
}
}
return NO;
}
你也可以檢查視圖的窗口物業:
if(actionSheet.window)
isBeingPresented = YES;
thanx的幫助,但自iOS 6以來,代碼段不再工作。 但是,我解決了這個問題。希望這有幫助
for (UIWindow* window in [UIApplication sharedApplication].windows) {
NSArray* subviews = window.subviews;
if ([subviews count] > 1) {
BOOL alert = [[subviews objectAtIndex:1] isKindOfClass:[UIAlertView class]];
BOOL action = [[subviews objectAtIndex:1] isKindOfClass:[UIActionSheet class]];
if (alert || action)
return YES;
}
}
return NO;
檢測警報似乎相對容易,但行動表讓我難住。在iOS中6.1,我不得不走一步
BOOL IsActionOpen(UIView* aView) {
BOOL actionOpen = NO;
if (aView) {
if ([aView isKindOfClass:[UIActionSheet class]]) {
actionOpen = YES;
}
else if (aView.subviews.count > 0) {
for (UIView* aSubview in aView.subviews) {
if (IsActionOpen(aSubview)) {
actionOpen = YES;
break;
}
}
}
}
return actionOpen;
}
- (BOOL) isAnActionSheetOpen {
BOOL actionOpen = NO;
for (UIWindow* w in [UIApplication sharedApplication].windows) {
actionOpen = IsActionOpen(w);
if (actionOpen)
break;
}
return actionOpen;
}
-(BOOL)GetKeyWindow {
UIViewController *presentedViewController = myAppDelegate.window.rootViewController.presentedViewController;
if (presentedViewController) {
if ([presentedViewController isKindOfClass:[UIActivityViewController class]] || [presentedViewController isKindOfClass:[UIAlertController class]]) {
return YES;
}else{
return NO;
NSLog(@"not present");
}
}
else{
return NO;
}
}
謝謝!我必須對提案進行兩項更改:(1)NSArray *中的子視圖,而不是UIView *。 (2)看起來UIActionSheet不是第一個[0]子視圖,而是第二個[1]。所以我迭代了視圖層次結構...代碼張貼爲答案... – Reuven 2010-12-06 06:15:25
我用TechZen的其他建議保留參考。我發現這個工作非常優雅。 – 2012-02-21 15:29:44
它也可以用於iOS 7嗎? – 2013-12-19 19:13:08