제 프로젝트 로직에 대한 설명 먼저!
우선 제 프로젝트는 일기 프로젝트인데
메인페이지인 달력에서 각 일정을 누르면 해당 일정에 대한 기록이 화면에 띄워집니다
달력의 cell 을 누르면 해당 일정에 대한 cell 을 init 하여 화면에 navigation 으로 화면에 띄워주는 로직을 사용했습니다
또한 일기 페이지의 navigation bar 를 커스텀 하여 사용해주었습니다
아래는 navigation bar 커스텀 내용 코드입니다!
// back 버튼
var configuration = UIButton.Configuration.plain() // 기본 스타일
configuration.image = UIImage(named: "back")
configuration.imagePadding = 10 // 이미지와 버튼의 경계 간격 설정
configuration.imagePlacement = .leading // 이미지 위치 설정
let button = UIButton(configuration: configuration)
button.frame = CGRect(x: 0, y: 0, width: 30, height: 30) // 버튼 크기 설정
button.addTarget(self, action: #selector(goBackPage), for: .touchUpInside)
var barButton = UIBarButtonItem(customView: button)
// 네비게이션 바에 추가 (왼쪽 버튼)
navigationItem.leftBarButtonItem = barButton
// 삭제할 데이터가 있는 경우에만 삭제 버튼 표기
guard data.3 != nil else { return }
let meatBallBtn = UIButton(type: .custom)
meatBallBtn.setImage(UIImage(named: "meatball"), for: .normal)
meatBallBtn.frame = CGRect(x: 24, y: 0, width: 35, height: 35) // 이미지 크기에 맞게 설정
meatBallBtn.addTarget(self, action: #selector(deleteDataBtnTapped), for: .touchUpInside)
barButton = UIBarButtonItem(customView: meatBallBtn)
// 네비게이션 바에 추가 (오른쪽 버튼)
navigationItem.rightBarButtonItem = barButton
그리고 커스텀 navigation bar 를 적용시켰을 때 왼쪽 -> 오른쪽 제스쳐가 실행되지 않더라구요
커스텀 navigation bar 가 표현된 viewcontroller 의 viewdidload 에 아래 코드를 넣어주면 해결됩니다
override func viewDidLoad() {
super.viewDidLoad()
// 커스텀 버튼을 추가하거나 특정 설정을 변경했을 때, 이 제스처가 의도대로 작동하지 않을 수 있다
// delegate를 초기화하여 제스처가 기본 동작을 따르도록 만듬. 이렇게 하면, 네비게이션 컨트롤러에서 커스텀 버튼을 추가했더라도 스와이프 제스처가 제대로 작동
navigationController?.interactivePopGestureRecognizer?.delegate = nil
}
문제상황
7초 경에 왼쪽 -> 오른쪽 제스쳐를 취했고, 바로 이어서 cell 을 누르면 화면 위쪽에 navigation bar 만 뜹니다...
일기 페이지가 떠야하는데 말이죠!!!
해결방법
원인은 아래 코드때문입니다
override func viewDidLoad() {
super.viewDidLoad()
// 커스텀 버튼을 추가하거나 특정 설정을 변경했을 때, 이 제스처가 의도대로 작동하지 않을 수 있다
// delegate를 초기화하여 제스처가 기본 동작을 따르도록 만듬. 이렇게 하면, 네비게이션 컨트롤러에서 커스텀 버튼을 추가했더라도 스와이프 제스처가 제대로 작동
navigationController?.interactivePopGestureRecognizer?.delegate = nil
}
A -> B 페이지로 네비게이션으로 이동을 했고, root navigation 이 A로 설정돼 있는 상황입니다
navigationController?.interactivePopGestureRecognizer?.delegate 를 해당 B viewcontroller 에서 바꿨기 때문에
A 에서 제스쳐에 대한 오류가 발생한 것입니다
그래서 A viewcontroller의 viewDidAppear에 아래 코드를 넣어주면 해결됩니다
override func viewDidAppear(_ animated: Bool) {
// WriteDiaryVC 에서 interactivePopGestureRecognizer = nil 으로 변경해두었기 때문에
// 메인화면으로 돌아올때마다 interactivePopGestureRecognizer 설정해야함
// 해당 작업을 하지 않으면 WriteDiaryVC 에서 사용하던 제스쳐 설정을 그대로 따르기 때문에 메인 페이지에서 오류발생
// 또한 viewDidAppear 에서 실행하는 이유는 write WriteDiaryVC 에서 이전 페이지로 온전히 다 넘어가지 않더라도 viewWillAppear 가 실행되기 때문에 WriteDiaryVC 에서 더이상 제스쳐가 먹히지 않음
navigationController?.interactivePopGestureRecognizer?.delegate = self
}