2013-09-30 25 views
0

此問題涉及當在iPad的webview/textview中選擇電話號碼或電子郵件時顯示動作表和彈出窗口的本機iOS功能。如果您需要更新,操作單包含兩個讀取「添加到聯繫人」和「複製」的按鈕。我所指的彈出窗口是用戶選擇「添加到聯繫人」按鈕時顯示的內容。關閉iPad中的原生UIActionsheet&UIPopover

我明白,駁回酥料餅的一個聲明:

[somePopoverController dismissPopoverAnimated:YES]; 

要關閉actionsheet,一個可以簡單地調用:

[someActionSheet dismissWithClickedButtonIndex:0 animated:YES]; 

然而,我的問題是,由於iOS的創建這些actionsheets /對我來說,我並不擁有它們,也不能引用它們來調用解僱方法。

爲什麼我需要這樣做的用例是因爲我的應用程序會在指定的無活動時間後將用戶登出。當用戶註銷時,儘管我已經進入了一個新的視圖控制器並刪除了舊的視圖控制器,但這些動作表/彈出仍然保留在屏幕上。

有誰知道我該如何引用這些我不擁有的popovers和actionsheet?任何建議將不勝感激!

回答

1

嗯,我已經找到了一種解決方案,解散UIActionSheets和創建的彈出窗口m在iPad上檢測電話號碼/電子郵件時的Webviews/Textviews。該解決方案基本上遍歷所有我的視圖使用遞歸,直到我找到我想解僱的意見。很多信貸必須去我在這篇文章Accessing UIPopoverController for UIActionSheet on iPad發現的答案。

要刪除UIActionSheets:

BOOL IsActionOpen(UIView* aView) { 
    BOOL actionOpen = NO; 
    if (aView) { 
     if ([aView isKindOfClass:[UIActionSheet class]]) { 
      actionOpen = YES; 
      [(UIActionSheet *)aView dismissWithClickedButtonIndex:0 animated:NO]; 
     } 
     else if (aView.subviews.count > 0) { 
      for (UIView* aSubview in aView.subviews) { 
       if (IsActionOpen(aSubview)) { 
        if ([aView isKindOfClass:[UIActionSheet class]]) { 
         actionOpen = YES; 
         [(UIActionSheet *)aView dismissWithClickedButtonIndex:0 animated:NO]; 
        }break; 
       } 
      } 
     } 
    } 
    return actionOpen; 
} 

- (void) removeActionSheetIfShowing { 
    BOOL actionOpen = NO; 
    for (UIWindow* w in [UIApplication sharedApplication].windows) { 
     actionOpen = IsActionOpen(w); 
     if (actionOpen) 
      break; 
    } 
} 

若要刪除選擇「添加到通訊錄」按鈕,從生成UIActionSheet時創建的酥料餅:

BOOL IsPopOverOpen(UIView* aView) { 
    BOOL popOverOpen = NO; 
    if (aView) { 
     //popover is a popoverview, not a popovercontroller. We find it by checking if UIPopoverBackgroundView exists 
     if([aView isKindOfClass:[UIPopoverBackgroundView class]]){ 
      popOverOpen = YES; 
      [aView.superview removeFromSuperview]; 
     } 
     else if (aView.subviews.count > 0) { 
      for (UIView* aSubview in aView.subviews) { 
       if (IsPopOverOpen(aSubview)) { 
        if([aView isKindOfClass:[UIPopoverBackgroundView class]]){ 
         popOverOpen = YES; 
         [aView.superview removeFromSuperview]; 
        }break; 
       } 
      } 
     } 
    } 
    return popOverOpen; 
} 

- (void) removePopOverIfShowing { 
    BOOL popOverOpen = NO; 
    for (UIWindow* w in [UIApplication sharedApplication].windows) { 
     popOverOpen = IsPopOverOpen(w); 
     if (popOverOpen) 
      break; 
    } 
} 
0

所有你需要的是在你的視圖控制器中保留對它們的引用。 當您創建UIActionSheet,例如,只要將其存儲在類型的屬性UIActionSheet

@property (strong, nonatomic) UIActionSheet *myActionSheet; 

然後,當你真正創建actionsheet,你做

self.myActionSheet = [[UIActionSheet alloc] initWithTitle:myTitle 
               delegate:self 
             cancelButtonTitle:cancelButtonTitle 
            destructiveButtonTitle:destButtonTitle 
             otherButtonTitles:otherButtonTitle, nil]; 

[self.myActionSheet showFromBarButtonItem:sender animated:YES]; 

而當你需要解僱你只需做

[self.myActionSheet dismissWithClickedButtonIndex:0 animated:YES]; 
+0

感謝您的答覆,但我不認爲你的答案會幫助我。問題是我從來沒有真正在代碼中創建UIAction表。該操作手冊由iOS爲我創建「神奇」,只需在webview/textview中添加電子郵件/電話號碼即可。 – bmjohns

+0

哦,好吧,我現在看到你的意思 – micantox