편집 취소 확인
- 편집을 취소했을때 실제로 취소할것인지 확인하는 기능 추가
현재 문제점
- 풀 스크린 모달이 아닌, 시트 형식으로 화면을 구성하였기 때문에 창을 아래로 내린다면 그대로 편집 창이 사라진다.
- 해당 상황에서 작성한 내용이 있다면 편집을 취소할 것인지 확인해야 한다.
기존의 메모 내용 저장 변수 추가
![](https://velog.velcdn.com/images/rudin_/post/9e6e7ad7-1620-45ce-b0ce-8898bf92c400/image.png)
이후 viewDidLoad에서 메모 편집 창으로 로드될 경우, 기존에 저장된 메모 내용을 해당 변수에 저장한다.
![](https://velog.velcdn.com/images/rudin_/post/0f31d7bd-77a2-479b-883d-e2e1320b2f2c/image.png)
그런 다음 뷰컨트롤러를 텍스트뷰의 델리게이트로 지정
![](https://velog.velcdn.com/images/rudin_/post/6ed376de-ae1b-48f3-9d6d-f864e79f573f/image.png)
delegate란?
- 대리자
- 하나의 객체가 모든 일을 처리하는 것이 아닌, 처리해야 할 일들 중 일부를 다른 객체에게 넘기는 방식
구현 단계
- 채택 작업(프로토콜 추가)
- 위임자 지정(여기서는 viewController가 위임자)
- 이제 이벤트가 발생하면 프로토콜에 따라 viewController가 대신 응답
- 프로토콜을 준수하는데 필요한 함수 작성
viewWillAppear,viewWillDisappear 추가
![](https://velog.velcdn.com/images/rudin_/post/fde90027-fb98-4210-9dfd-bec6234e6083/image.png)
우리가 추가하려는 기능을 위해선 프레젠테이션 컨트롤러 델리게이트를 추가로 설정해야 함.
![](https://velog.velcdn.com/images/rudin_/post/ef79c48f-dd30-4068-9e4f-b4ab3c07e493/image.png)
이렇게 하면 편집 화면이 표시되기 직전에 델리게이트로 설정되었다가, 사라지기 직전에 델리게이트가 해제된다.
채택 작업(extension에 작성)
UITextViewDelegate
![](https://velog.velcdn.com/images/rudin_/post/1158633e-6dbf-4168-a170-acfab40a4ae1/image.png)
textViewDidChange
: 텍스트뷰가 편집될때마다 반복적으로 호출
![](https://velog.velcdn.com/images/rudin_/post/4e33da09-202b-405c-90a5-9e67d3da60c6/image.png)
- 모달 방식으로 동작해야하는지 결정하는 플래그로 동작
- 풀다운으로 닫기 전에 델리게이트 호출
- iOS13 부터만 사용 가능 -> 사용할거면 availability condition 추가해야 함. (물론 내 작업 버전 기준에서는 상관 없다)
- 만약 iOS13 이전 버전이라면 아래의 작업을 해주어야 한다.
![](https://velog.velcdn.com/images/rudin_/post/65395f5a-07e9-4849-9aac-ca92e675dbe3/image.png)
텍스트뷰를 편집할때마다 원본과 다른지 확인, 원본과 다르면 메모가 편집된 것으로 판단. 편집된 경우 isModalInPresentation
이 true가 되기 때문에 시트 방식의 풀다운이 작동되지 않는다. (창을 내려도 중간까지만 내려가다가 다시 원상복구됨.)
UIAdaptivePresentationControllerDelegate
![](https://velog.velcdn.com/images/rudin_/post/b17ef61c-6d28-43bd-b3bb-c96a7d1707ba/image.png)
![](https://velog.velcdn.com/images/rudin_/post/869950ad-d2b6-41ab-b50b-1259e3b20bb4/image.png)
- 위에서
isModalInPresentation
이 true가 될 경우 이 함수가 실행된다.
- 이제 여기서 경고창을 추가하고, 사용자가 저장과 취소를 선택하도록 구현
경고창 표시 구현
AlertController 추가
![](https://velog.velcdn.com/images/rudin_/post/601211be-49db-4544-84d6-8333d2d6d154/image.png)
버튼 추가
확인 액션
![](https://velog.velcdn.com/images/rudin_/post/3e6bdb6c-8671-4d51-a654-12e6ad6a8cbd/image.png)
취소 액션
![](https://velog.velcdn.com/images/rudin_/post/1647fad2-ce32-4151-be88-251876e24bd3/image.png)
present
![](https://velog.velcdn.com/images/rudin_/post/c2805088-0493-4ede-8452-d3393132e365/image.png)
실행 화면
![](https://velog.velcdn.com/images/rudin_/post/dba6ba63-adfe-4ce0-8ab0-200fa292f5b4/image.png)