iOS 13의 PageSheet에서 dismiss를 부를 때도 pr e s e n t ation Controller Did Dismiss라는 사연입니다.

6043 단어 SwiftXcode11iOS13

개시하다


안녕하세요, 저는fummicc1입니다.이번에는 iOS 13에서 설정modalPresentationStyle을 변경.pageSheet했을 때의 행동을 설명한 뒤 실제 어떤 코드를 썼는지 소개한다.

iOS 13용 시트 워크시트


iOS 13부터 아이폰까지 페이지 테이블의 행동이 크게 달라졌다.그리고 기본적으로 페이지 작업표에서 이동합니다.
지금까지(iOS 13 이전)는 .fullScreen와 같은 행동이었지만, 이번부터는 이불 같은 UI가 됐다.(참조 이미지)

우선 다음과 같은 API가 호출되지 않습니다.
  • viewWillAppear
  • viewWillDisappear
  • 이것은 기존의 응용 프로그램을 파괴할 수 있기 때문에 긴급하게 대응하는 곳이 많다.
    예를 들어 모델이 목적지를 이동하는 화면에서 일기나 ToDo를 만들고 save 단추를 눌러 저장 처리를 하고 dismiss 화면을 만든다.
    이 경우 이전viewWillAppear에서collectionViewtableView 등 UI의 업데이트 처리가 비교적 많았다.
    단, 페이지시트 전환은 디스미스viewWillAppear가 호출되지 않기 때문에 일기와 ToDo를 저장한 후의 상태는 UI에 반영되지 않습니다.이번에는 이에 대응하는 방법을 소개한다.

    대책


    1. .full Screen을 만듭니다.

    modalPresentationStyle에서 .pageSheet 대신 .fullScreen를 지정합니다.그러면 기존의 방법으로 대화를 할 수 있다.

    2. .직접 설치.


    presentationControllerDidDismiss 이 방법은 iOS 13에서 추가된 것이기 때문에 그것을 사용합니다.
    이 방법은 목표 화면을 이동하는 실례에서 실현된다presentationController?.delegate = self.이때self(遷移元の画面)는 반드시 부합되어야 한다UIAdaptivePresentationControllerDelegate.
    또한 이것UIAdaptivePresentationControllerDelegatepresentationControllerDidDismiss이 있기 때문에 다음과 같이 실시한다.
    RootViewController.swift
    func transitionToModalViewController() {
        let modalViewController = storyboard?.instantiateViewController(identifier: "ModalViewController") as! ModalViewController
        modalViewController.presentationController?.delegate = self // ここがポイント
        present(modalViewController, animated: true, completion: nil)
    }
    
    RootViewController.swift
    extension RootViewController: UIAdaptivePresentationControllerDelegate {
        // このメソッドを実装
        func presentationControllerDidDismiss(_ presentationController: UIPresentationController) {
            // Modal画面から戻った際の画面の更新処理を行う。 (collectionView.reloadDataなど。)
        }
    }
    
    이렇게 하면 사용자가 모델 화면에서 교환할 때도 업데이트 처리를 할 수 있다.

    dismiss로 Modal을 닫으면 p r e s e n t ation Controller DidDismis는 부르지 않습니다.


    이 처리 방법은 최선의 실천 방법은 아니지만 과도작의 화면dismiss을 다시 쓰는 것presentationController.delegate?.presentationControllerDidDismiss?(presentationController)이라고 한다.
    ModalViewController.swift
    extension ModalViewController {   
        override func dismiss(animated flag: Bool, completion: (() -> Void)? = nil) {
            super.dismiss(animated: flag, completion: completion)
            guard let presentationController = presentationController else {
                return
            }
            presentationController.delegate?.presentationControllerDidDismiss?(presentationController)
        }
    }
    
    이렇게 하면 dismiss를 통해 화면을 되돌려도 UI의 업데이트 처리라고 불린다.

    최후


    iOS 13의 변화로는 다크 모드 대응과 시그널 인 위드 애플 대응 등도 어렵지만, 모델도 상당한 변화의 대응 소요비용을 느꼈고, 이번 보도 역시 자원이 적은 상황에서 해결돼 개인이 만족하지 못하는 만큼 앞으로 API를 개선할 것으로 보인다.나는 더 좋은 방법이 있기를 바란다.
    만약 수정과 의견이 있다면, 나는 당신의 평론을 기다리겠습니다.참고가 됐으면 좋겠어요!

    좋은 웹페이지 즐겨찾기