iOS 13의 PageSheet에서 dismiss를 부를 때도 pr e s e n t ation Controller Did Dismiss라는 사연입니다.
개시하다
안녕하세요, 저는fummicc1입니다.이번에는 iOS 13에서 설정modalPresentationStyle
을 변경.pageSheet
했을 때의 행동을 설명한 뒤 실제 어떤 코드를 썼는지 소개한다.
iOS 13용 시트 워크시트
iOS 13부터 아이폰까지 페이지 테이블의 행동이 크게 달라졌다.그리고 기본적으로 페이지 작업표에서 이동합니다.
지금까지(iOS 13 이전)는 .fullScreen
와 같은 행동이었지만, 이번부터는 이불 같은 UI가 됐다.(참조 이미지)
우선 다음과 같은 API가 호출되지 않습니다.
iOS 13부터 아이폰까지 페이지 테이블의 행동이 크게 달라졌다.그리고 기본적으로 페이지 작업표에서 이동합니다.
지금까지(iOS 13 이전)는
.fullScreen
와 같은 행동이었지만, 이번부터는 이불 같은 UI가 됐다.(참조 이미지)우선 다음과 같은 API가 호출되지 않습니다.
예를 들어 모델이 목적지를 이동하는 화면에서 일기나 ToDo를 만들고 save 단추를 눌러 저장 처리를 하고 dismiss 화면을 만든다.
이 경우 이전
viewWillAppear
에서collectionView
와 tableView
등 UI의 업데이트 처리가 비교적 많았다.단, 페이지시트 전환은 디스미스
viewWillAppear
가 호출되지 않기 때문에 일기와 ToDo를 저장한 후의 상태는 UI에 반영되지 않습니다.이번에는 이에 대응하는 방법을 소개한다.대책
1. .full Screen을 만듭니다.
modalPresentationStyle
에서 .pageSheet
대신 .fullScreen
를 지정합니다.그러면 기존의 방법으로 대화를 할 수 있다.
2. .직접 설치.
presentationControllerDidDismiss 이 방법은 iOS 13에서 추가된 것이기 때문에 그것을 사용합니다.
이 방법은 목표 화면을 이동하는 실례에서 실현된다presentationController?.delegate = self
.이때self(遷移元の画面)
는 반드시 부합되어야 한다UIAdaptivePresentationControllerDelegate
.
또한 이것UIAdaptivePresentationControllerDelegate
은 presentationControllerDidDismiss
이 있기 때문에 다음과 같이 실시한다.
RootViewController.swiftfunc transitionToModalViewController() {
let modalViewController = storyboard?.instantiateViewController(identifier: "ModalViewController") as! ModalViewController
modalViewController.presentationController?.delegate = self // ここがポイント
present(modalViewController, animated: true, completion: nil)
}
RootViewController.swiftextension 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.swiftextension 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를 개선할 것으로 보인다.나는 더 좋은 방법이 있기를 바란다.
만약 수정과 의견이 있다면, 나는 당신의 평론을 기다리겠습니다.참고가 됐으면 좋겠어요!
Reference
이 문제에 관하여(iOS 13의 PageSheet에서 dismiss를 부를 때도 pr e s e n t ation Controller Did Dismiss라는 사연입니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/fummicc1_dev/items/a30e3cbfbf1148b0ec84
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
func transitionToModalViewController() {
let modalViewController = storyboard?.instantiateViewController(identifier: "ModalViewController") as! ModalViewController
modalViewController.presentationController?.delegate = self // ここがポイント
present(modalViewController, animated: true, completion: nil)
}
extension RootViewController: UIAdaptivePresentationControllerDelegate {
// このメソッドを実装
func presentationControllerDidDismiss(_ presentationController: UIPresentationController) {
// Modal画面から戻った際の画面の更新処理を行う。 (collectionView.reloadDataなど。)
}
}
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)
}
}
iOS 13의 변화로는 다크 모드 대응과 시그널 인 위드 애플 대응 등도 어렵지만, 모델도 상당한 변화의 대응 소요비용을 느꼈고, 이번 보도 역시 자원이 적은 상황에서 해결돼 개인이 만족하지 못하는 만큼 앞으로 API를 개선할 것으로 보인다.나는 더 좋은 방법이 있기를 바란다.
만약 수정과 의견이 있다면, 나는 당신의 평론을 기다리겠습니다.참고가 됐으면 좋겠어요!
Reference
이 문제에 관하여(iOS 13의 PageSheet에서 dismiss를 부를 때도 pr e s e n t ation Controller Did Dismiss라는 사연입니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/fummicc1_dev/items/a30e3cbfbf1148b0ec84텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)