iOS 13 이후에viewWillApper 또는viewDidApper라고 부르지 않을 때의 대처법

10845 단어 Swiftios13tech
예를 들어, ViewController A에서 ViewController B를 표시하여 데이터 값을 재정의합니다.그리고 ViewController B의 작업이 끝난 후에 꺼지면 ViewController A의viewWillAppearviewDidAppear에 새 데이터의 값tableview.reloadData() 등을 표시하는 것이 흔한 패턴이다.
지금은 좀 더 진일보한 얘기지만 iOS 12로 계속 이동하는 이 코드가 그렇게 되면 iOS 13 이후에는 움직이지 못하게 된다.바로 몇 번 넘어져서 간단하게 정리했다.

결론에 따르다


우선 다음과 같은 내용을 확인한다.
https://developer.apple.com/videos/play/wwdc2019/224/
그리고 이거 다운 받아서 잘 읽어.
https://developer.apple.com/documentation/uikit/view_controllers/disabling_pulling_down_a_sheet
마지막으로 UIAdaptivePresentationControllerDelegate를 사용하여 지금까지의 코드를 다시 씁니다.
왜 이렇게 가만히 있어?어떻게 하면 좋을까요?알 거예요.
다음은 몇 가지 해결 방법을 간단하게 설명한다.

전체 화면 표시


첫 번째는 ViewController B를 전체 화면으로 바꾸는 방법입니다.이렇게 하면 이전과 마찬가지로 ViewController AviewWill/DidAppear라고 부른다.
iOS 13 이후 이전처럼 아무런 고려도 없이 새로운 화면을 표시하면 워크시트 유형의 화면viewWill/DidAppear이 호출되지 않기 때문에 모든 화면을 표시하여 iOS 12 이전의 행동과 동일하게 한다.
Storyboard의 경우 Segue 설정Present ModallyFull Screen을 통해

코드의 경우 SecondViewController는 다음과 같습니다.
secondViewController.modalPresentationStyle = .fullScreen
present(secondViewController, animated: true, completion: nil)
지금까지 코드가 제대로 작동하지 않았고, 원래 새 화면은 풀스크린으로 표시됐기 때문에 조화롭지 못한 느낌은 없을 것 같다.
그러나 이미 iOS 14가 등장한 현재 사용자들은 지금과 조금 다른 행동을 느낄 수 있다.

스왑 공간을 닫을 수 없습니다.

isModalInPresentation라는 속성이 있기 때문에 ViewController B로 false하고 교환으로 화면을 닫을 수 없습니다.필연적으로unwinddismiss 등 코드와 Segue 닫기 화면을 ViewController A로 되돌려야 하기 때문에 닫힌 이벤트를 ViewController A에 전달하거나 데이터를 다시 읽는 코드를 미리 적어두세요.
하지만 현재의 작업표로 보이지만 교환으로 봉하지 못하면 사용자에게 불협화음을 줄 수 있다.

U I Ad a p t i v e P r e entation Controller Delegate 사용


앞의 영상과 샘플 코드로 하는 방법.UIAdaptivePresentationControllerDelegate를 통해 교환기기로 작업표를 닫을 수 있는지 등을 확인하고 ViewController B를 통해 이 작업표를 받아 ViewController B가 닫힌 시간을 측정한다.그 프로토콜을 ViewController A에 전달합니다.
구체적으로 이런 느낌이에요.
요컨대UIAdaptivePresentationControllerDelegate의 부분.
각종 이벤트를 받고 sheet을 닫을 때delegate 원래의 ViewController AviewDidDismiss를 호출합니다.여기서는 ViewController A에서 데이터를 업데이트합니다.
자세한 내용은 샘플 코드를 확인하세요.
extension ThirdViewController: UIAdaptivePresentationControllerDelegate {
    func presentationControllerShouldDismiss(_ presentationController: UIPresentationController) -> Bool {
        print("\(type(of: self)): \(#function)")
        return true
    }
    
    func presentationControllerDidAttemptToDismiss(_ presentationController: UIPresentationController) {
        print("\(type(of: self)): \(#function)")
    }
    
    func presentationControllerWillDismiss(_ presentationController: UIPresentationController) {
        print("\(type(of: self)): \(#function)")
    }
    
    func presentationControllerDidDismiss(_ presentationController: UIPresentationController) {
        print("\(type(of: self)): \(#function)")
        delegate?.viewDidDismiss()
    }
}

어느 것이 좋아요?


만약 새로운 응용 프로그램UIAdaptivePresentationControllerDelegate이라면, 나는 지금 사용하는 것이 비교적 좋다고 생각한다.그러나 기존 애플리케이션이라면 전체 화면UIAdaptivePresentationControllerDelegate과 UX의 균형을 맞추는 것이 좋다.

코드


GiitHub에게 전체 화면의 방법과 사용UIAdaptivePresentationControllerDelegate 방법을 시험적으로 사용한 샘플을 주었다.
각각의 방법으로 어떤 순서로 어떤 호칭을 받는지 나타낸다.
https://github.com/paraches/sheetStudy
겸사겸사 일지는 아래와 같다.
// 起動時Viewが表示される
ViewController: viewWillAppear(_:)
ViewController: viewDidAppear(_:)
// Full Screen クリックてSecondViewが表示される
SecondViewController: viewWillAppear(_:)
SecondViewController: viewDidAppear(_:)
// backをクリックして元のViewが表示される
ViewController: unwindToFirstViewController(_:)
ViewController: viewWillAppear(_:)
ViewController: viewDidAppear(_:)

// sheetをクリックしてThirdViewが表示される
ThirdViewController: viewWillAppear(_:)
ThirdViewController: viewDidAppear(_:)
// sheetをドラッグして閉じViewに戻る
ThirdViewController: presentationControllerShouldDismiss(_:)
ThirdViewController: presentationControllerWillDismiss(_:)
ThirdViewController: presentationControllerDidDismiss(_:)
ViewController: viewDidDismiss()

최후


아직도'어? 뷰윌앱 아니야?'이런 일을 했기 때문에 쉽게 기억할 수 있도록 필기를 했다.
이것뿐만 아니라 이렇게 하는 말이 갈수록 많아지기 때문에 반드시 진지하게 기록해야 한다.

좋은 웹페이지 즐겨찾기