iOS 13 이후에viewWillApper 또는viewDidApper라고 부르지 않을 때의 대처법
viewWillAppear와 viewDidAppear에 새 데이터의 값tableview.reloadData() 등을 표시하는 것이 흔한 패턴이다.지금은 좀 더 진일보한 얘기지만 iOS 12로 계속 이동하는 이 코드가 그렇게 되면 iOS 13 이후에는 움직이지 못하게 된다.바로 몇 번 넘어져서 간단하게 정리했다.
결론에 따르다
우선 다음과 같은 내용을 확인한다.
그리고 이거 다운 받아서 잘 읽어.
마지막으로
UIAdaptivePresentationControllerDelegate를 사용하여 지금까지의 코드를 다시 씁니다.왜 이렇게 가만히 있어?어떻게 하면 좋을까요?알 거예요.
다음은 몇 가지 해결 방법을 간단하게 설명한다.
전체 화면 표시
첫 번째는 ViewController B를 전체 화면으로 바꾸는 방법입니다.이렇게 하면 이전과 마찬가지로 ViewController A
viewWill/DidAppear라고 부른다.iOS 13 이후 이전처럼 아무런 고려도 없이 새로운 화면을 표시하면 워크시트 유형의 화면
viewWill/DidAppear이 호출되지 않기 때문에 모든 화면을 표시하여 iOS 12 이전의 행동과 동일하게 한다.Storyboard의 경우 Segue 설정
Present Modally과 Full Screen을 통해코드의 경우
SecondViewController는 다음과 같습니다.secondViewController.modalPresentationStyle = .fullScreen
present(secondViewController, animated: true, completion: nil)
지금까지 코드가 제대로 작동하지 않았고, 원래 새 화면은 풀스크린으로 표시됐기 때문에 조화롭지 못한 느낌은 없을 것 같다.그러나 이미 iOS 14가 등장한 현재 사용자들은 지금과 조금 다른 행동을 느낄 수 있다.
스왑 공간을 닫을 수 없습니다.
isModalInPresentation라는 속성이 있기 때문에 ViewController B로 false하고 교환으로 화면을 닫을 수 없습니다.필연적으로unwind와dismiss 등 코드와 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 방법을 시험적으로 사용한 샘플을 주었다.각각의 방법으로 어떤 순서로 어떤 호칭을 받는지 나타낸다.
겸사겸사 일지는 아래와 같다.
// 起動時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()
최후
아직도'어? 뷰윌앱 아니야?'이런 일을 했기 때문에 쉽게 기억할 수 있도록 필기를 했다.
이것뿐만 아니라 이렇게 하는 말이 갈수록 많아지기 때문에 반드시 진지하게 기록해야 한다.
Reference
이 문제에 관하여(iOS 13 이후에viewWillApper 또는viewDidApper라고 부르지 않을 때의 대처법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/paraches/articles/dont-call-viewwillappear텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)