2013-09-30 4 views
0

이 질문은 iPad의 webview/textview에서 전화 번호 또는 이메일을 선택하면 작업 시트 및 팝업을 표시하는 기본 iOS 기능을 참조합니다. 새로 고침이 필요한 경우 작업 표에는 "연락처에 추가"및 "복사"라는 두 개의 버튼이 있습니다. 여기서 내가 말하는 팝 오버는 사용자가 "연락처에 추가"버튼을 선택할 때 표시되는 것입니다. iPad의 기본 UIActions 시트 및 UIPopover 해제

내가 팝 오버의 하나가 선언 그 해제 이해 :

[somePopoverController dismissPopoverAnimated:YES]; 

는 actionsheet을 닫으려면 하나는 단순히 호출 할 수 있습니다

[someActionSheet dismissWithClickedButtonIndex:0 animated:YES]; 

하지만, 내 문제가 있음을 아이폰 OS이 actionsheets을 생성하기 때문에/저를위한 popovers, 나는 그 (것)들을 소유하지 않으며, 해산 방법을 부르기 위하여 그 (것)들을 참조 할 수 없다.

왜 이렇게해야하는지에 대한 사례는 내 애플리케이션이 지정된 시간 동안 아무런 활동이 없으면 사용자를 로그 아웃하기 때문입니다. 사용자가 로그 아웃 할 때 새로운 액션 컨트롤러를 입력하고 이전보기 컨트롤러를 제거했지만이 액션 시트/팝업은 여전히 ​​화면에 남아 있습니다.

내가 소유하지 않은 이러한 popovers 및 actionsheets를 참조 할 수있는 사람이 누구인지 알고 있습니까? 모든 조언을 크게 주시면 감사하겠습니다!

답변

1

음, 나는 UIActionSheets와 popover를 모두 해산하는 해결책을 발견했다. 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를 만들 때 는, 예를 들어, 당신이 실제로 actionsheet를 만들 때, 당신은

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

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

을 그리고 당신은 해고해야 할 때 UIActionSheet

@property (strong, nonatomic) UIActionSheet *myActionSheet; 

그런 유형의 속성에 저장 그냥하면 돼.

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

감사합니다 응답을,하지만 그렇게하지 당신의 대답이 나를 도울 것이라고 생각하십시오. 문제는 코드에서 UIAction 시트를 실제로 생성하지 않는다는 것입니다. 액션 시트는 iOS에 의해 webview/textview에서 이메일/전화 번호 만 가지고 "마법처럼"만들어졌습니다. – bmjohns

+0

우우, 알았어. 무슨 뜻인지 알 겠어. – micantox