2017-10-06 17 views
1

사용자가 iCloud 문서에서 파일을 업로드 할 수 있도록 웹 기반 UI를로드하는 WKWebview가 있습니다. 올바른 사용 권한을 부여했으며 iCloud 문서를 탐색 할 수 있습니다. 그러나 파일을 선택하거나 취소 버튼을 클릭하면 내 WKWebview의 부모보기를 닫는 문서 선택기보기도 닫힙니다.WKWebview에서 iCLoud 문서 선택 도구 컨테이너보기 해제

해고 경로를 추적하려했습니다. 나는 내보기에 해고 기능을 호출하지 않을 것이라고 확신한다.

누군가 내 WKWebview 컨테이너에서 해제를 트리거하는 이유와 그 방지 방법을 알고 있습니까?

답변

1

WKWebView를 사용하여 Objective-C 및 iOS11에서 동일한 문제가 발생했으며 해결 방법을 사용하여 해결했습니다. 당신은 쉽게 스위프트으로 마이그레이션 할 수 있어야한다 :

내 WKWebView가 직접 뷰 컨트롤러 내부의 UIViewController
  • 을 연장하는 뷰 컨트롤러에 의해 소유되었다

    • 이 약한 속성을 추가

      @property (weak, nonatomic) UIDocumentPickerViewController *_Nullable docPickerPtr;

    • 동일한 뷰 컨트롤러 내부에서 원래 UIViewController 기본 클래스의 일부인이 두 메서드를 재정의합니다.

      (210)
    • 는 우리가 할 것은 :

      1. 우리가 문서 선택기를 표시 UIDocumentPickerViewController
      2. dismissViewControllerAnimated에 약한 포인터를 저장하려고있을 때 : completition가 두 번 호출됩니다. 한번 presentationViewController가 실제 문서 선택 도구를 죽이기 위해 nil이 아니며, presentViewController가 사라졌지만 UIDocumentPickerViewController가 아직 살아있을 때 알 수없는 이유로 2 번 알려줍니다. 아이디어는이 2가 UIDocumentPickerViewController에서 문제가
      3. 슈퍼
  • 0

    로 전파 해제를 방지하는 것입니다.

    1)보기 컨트롤러가 UIDocumentPickerViewController을 선물 한 내용의 내부에 약한 참조 번호 UIDocumentPickerViewController을 저장하십시오. (이것은 일반적으로 UINavigationController 그래서 당신은 아마이 문제를 해결하기 위해 UINavigationController를 서브 클래스해야합니다 끝나게.)

    ///Due to a bug in UIDocumentPickerViewController we need to stop the UIDocumentPickerViewController from dismissing this navigation controller. Or at least provide control. This is a weak reference to a UIDocumentPickerController that this controller presents 
    weak var documentPicker: UIDocumentPickerViewController? 
    

    2) 이제 UIDocumentPickerViewController

    //MARK: Overrides 
    override public func dismiss(animated flag: Bool, completion: (() -> Void)? = nil) { 
        if self.presentedViewController == nil && self.documentPicker != nil { 
         self.documentPicker = nil 
        }else{ 
         super.dismiss(animated: flag, completion: completion) 
        } 
    } 
    
    public override func present(_ viewControllerToPresent: UIViewController, animated flag: Bool, completion: (() -> Void)? = nil) { 
        if viewControllerToPresent is UIDocumentPickerViewController { 
         self.documentPicker = viewControllerToPresent as? UIDocumentPickerViewController 
        } 
        super.present(viewControllerToPresent, animated: flag, completion: completion) 
    } 
    

    을 제시하는 UIViewController 이러한 두 가지 기능을 오버라이드 (override) UIDocumentPickerViewController의 두 번째 전화는 제시된 UIViewController을 닫지 않습니다.