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.)