2014-09-05 1 views
3

UIActivityViewController에 대한 호출이 ViewWillDisappear을 호출하지 않지만 사용자가 VC에서 반환하면 ViewWillAppear을 호출하는 것으로 나타났습니다. 이 과정은 처음에는 사용자가 텍스트 나 이메일 같은 것을 선택할 수 있도록 절반 화면을 가져 오는 2 단계입니다. 여기서 취소하면 ViewWillAppear을 호출하지 않고 호출 VC로 되돌아갑니다. 이건 괜찮아. 그러나 텍스트와 같은 통신 옵션을 선택하면 VC는 절대로 ViewWillDisappear을 호출하는 전체 화면 텍스트 VC로 바뀝니다.UIActivityViewController ViewWillAppear을 호출하지만 ViewWillDisappear를 호출하지 않음

그러나 수동으로 ViewWillDisappear을 호출 할 수 있습니다. 그러나 사용자가 전체 화면 전환 이전에 작은 절반 화면에서 '취소'를 선택했는지 여부는 알 수 없습니다. ActivityVC를 호출

코드는 다음과 같습니다

UIActivityViewController *activityController = [[UIActivityViewController alloc]initWithActivityItems:shareAray 
               applicationActivities:nil]; 

[self presentViewController:activityController 
          animated:YES completion:nil]; 

ViewWillAppear를 호출 않습니다 반환 할 때 ViewWillDisappear가 호출되지 않는 이유 모든 이유? 어쨌든 사용자가 실제로 작은 전체 화면 공유를 계속하지 않는 한 ViewWillDisappear이라고 직접 전화하지 않도록 작은 절반 화면에서 '취소'를 누르는 지 알고 싶습니까? 보기 컨트롤러 제시에

+0

'viewWillAppear :'이 (가) 어떻게 호출되는지 알고 싶습니까?여기에 인스턴스화되는 UIActivityViewController 하위 클래스가 없습니다. 아니면 하위 클래스를 인스턴스화하는 데 대한 데모입니까? – Gutblender

+0

나는 당신의 질문을 정말로 이해하지 못합니다. 위의 코드는 UIActivityVC를 호출하는 데 사용됩니다. 호출 VC의 ViewWillAppear 및 ViewWillDisappear에 중단 점을 배치합니다. activityController에서 돌아 오면 (메시징 옵션에 대한 반 화면 질문이 아닌 전체 화면 메시지로 이동 한 후) ViewWillAppear이 호출됩니다 (다시 중단 점에 의해 catch 됨). – C6Silver

+0

그리고 'self'가 가리키는 'UIViewController'에서'viewWillAppear :'와'viewWillDisappear :'에이 중단 점을 설정하고 있습니까? – Gutblender

답변

0

위의 교환을 통해 Gutblender가 지적했듯이 UIActivityVC는 modalPresentationStyle로 인해 ViewWillDisappear를 호출하지 않습니다. ViewWillDisappear를 호출해야하는 전체 화면으로 전환 할 때처럼 Apple이이 문제를 처리하는 것처럼 느껴지지 않습니다. 그러나, 나는 그것을 스스로 부르지 않았기 때문에. 그것은 말했고 ViewWillDisappear를 호출하는 문제 만이 아니다. Apple이 보여주는 첫 번째 화면 (통신 옵션을 선택하기위한 절반의 화면)은 ViewWillAppear 또는 ViewWillDisappear를 호출하지 않기 때문에 사용자가 그 단계에서 취소 할 것입니다. 사용자가 다음에 표시되는 메시징 화면에서 취소하더라도 메시지가 표시되지 않고 계속 이동하면 ViewWillDisappear가 호출되지 않은 상태로 제시되는 VC의 ViewWillAppear이 호출됩니다. 따라서 ViewWillAppear 및 ViewWillDisappear 호출을 동일하게 유지하려면 (한 번 이상 등록하지 않으려는 NSNotification 개체가 있음) 아래 코드를 사용하고 있습니다. 사용자가 처음으로 약간의 절반 화면에서 취소하는 경우 설명의 방법으로

[self viewWillDisappear:YES]; 

    UIActivityViewController *activityController = [[UIActivityViewController alloc]initWithActivityItems:shareAray 
                        applicationActivities:nil]; 

    [self presentViewController:activityController 
         animated:YES completion:nil]; 

    [activityController setCompletionHandler:^(NSString *activityType, BOOL completed){ 
     if (!activityType || UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) 
     { 
      [self viewWillAppear:YES]; 
     } 
    }]; 

, activityType 위 NULL이됩니다. 다음 화면 (전체 화면)으로 이동하면 취소하더라도 activityType이 포함됩니다. 그래서 첫 번째 작은 절반 화면에서 취소하면 viewWillAppear을 강제로 호출해야합니다. 그렇지 않으면 정규 프로세스가 자동으로 viewWillAppear을 호출합니다.

0

있어서 presentViewControllerviewWillAppear: 호출되도록 할 것이고,이어서 viewWillDisappear:은 사라질 때쯤 보기 컨트롤러 제시 호출한다. 이러한 호출을 인터셉트하려면 UIActivityViewController을 서브 클래스 화하고 해당 메소드에 대한 대체를 구현하십시오.

사용자가 취소했는지 여부를 알려주는 방법은 Windows Forms에서 일반적으로 수행하는 방식으로하는 것이 좋습니다. 전화 (또는 제시)보기 컨트롤러가 호출 된 이유 (또는 여기에 self.presentedViewController)를 알 수 있도록 일부 값 범위 중 하나로 설정된 종류의 공용 "대화 결과"속성 (아마도 get - 노출 됨)을 추가하십시오. 사건)은 해산했다.

+0

내가 여기서해야 할 일이 분명하지 않다. ViewWillAppear을 가로 챌 수 있다면 왜 ViewWillDisappear를 가로 챌 수 없습니까? 앱의 동작에 따라 ViewWillDisappear가 호출되지 않는다는 것을 알고 있습니다. – C6Silver

+0

제시된 뷰 컨트롤러 위에'viewWillDisappear'가 호출되지 않는다고 말했습니까? 그런데 왜 그렇게 불릴까요? 그것은 사라지지 않을 것입니다. 그러나 사라지는 것은 ** 제시된 ** 뷰 컨트롤러입니다. 그러 G로 해당 메소드를 대체하고 인터셉트하는 하위 클래스를 사용하십시오. 프리젠 테이션 VC에서, 프리젠 테이션 VC의 뷰가 다시 나타나려고한다고 가정하기 때문에, 'viewWillAppear :'라는 이유는 프리젠 테이션 된 VC가 사라질 때 호출됩니다. – Gutblender

+0

감사합니다. 나는 어디에서 왔는지 이해하고 있습니다. 내 이해는 UIActivityVC로 대체 될 때 나타나는 VC가 사라질 것이라는 것이 었습니다. 당신은 그것이 일어나고있는 것처럼 보이는 것이 아니라고 제안하고 있습니다. 왜 그런지 모르겠습니다. 문제는 ViewWillAppear에 NSNotification 객체가 있다는 것입니다. 그들은 현재의 VC에서 ViewWillDisappear에서 제거됩니다. 따라서이 경우 ViewWillAppear은 ViewWillDisappear에서 제거되지 않은 상태로 관찰자를 다시 추가합니다. – C6Silver

0

활동 컨트롤러에 대한 강력한 참조를 유지합니까? 어쩌면 출시 될지도 모릅니다. 당신의 클래스 안에 컨트롤러를 선언 해보십시오.

+0

유지 문제가 아닌 것으로 보입니다. 첫 번째 VC가 절반 밖에 안되기 때문에 Apple이 viewWillDisappear를 호출하지 않는 것처럼 보입니다. 이 모든 것이 하나의 호출에서 이루어지기 때문에 두 화면간에 다른 작업을 수행 할 방법이 없습니다. 사용자가 전체 메시징 화면으로 이동하면 Apple이 viewWillDisappear를 호출해야한다고 생각합니다. – C6Silver

관련 문제