[Swift/UIKit] UINavigationController와 delegate
수정일: 2026. 3. 6.
카테고리:
태그:
ios 개발에는 delegate pattern이라는게 존재한다.
delegate pattern은, 어떤 객체 A가 처리해야 할 일을 외부 의존성에 의존하는 것을 의미합니다.
예를 들어 객체 A는 어떤 작업을 실행해야 하는데, 그 작업이 객체 B에게 특화된 작업이라 합시다. 그렇다면 A는 B를 의존하여 A의 메서드 내부에서 서브루틴으로 의존하고 있는 B의 메서드를 실행하면 됩니다.
// 1. 프로토콜 정의
protocol CustomDelegate: AnyObject {
func didFinishTask(data: String)
}
class Sender {
// 2. 위임자: delegate 프로퍼티 생성 (강한 참조 사이클 방지를 위해 weak 사용)
weak var delegate: CustomDelegate?
func doSomething() {
// 작업 완료 후 대리자에게 알림
delegate?.didFinishTask(data: "작업 완료!")
}
}
// 3. 대리자: 프로토콜 채택 및 구현
class Receiver: CustomDelegate {
func didFinishTask(data: String) {
print("받은 데이터: \(data)")
}
}
// 4. 연결
let sender = Sender()
let receiver = Receiver()
sender.delegate = receiver
sender.doSomething()
위 예시에서 sender는 doSomething method를 실행하지만 실제 업무는 recevier가 처리합니다.
sender는 recevier에게 위임하는 형태를 취하는 것입니다.
UINavigationController에서도 위 방식을 사용합니다.
UINavigationController는 push/pop을 처리할 때, push를 하면 스택에 VC를 추가하고, pop을 하면 스택에서 VC를 제거합니다.
각각의 애니메이션에 대한 처리는 UINavigationController가 직접 처리합니다.
이 때, UINavigationControllerDelegate를 확장하여 각 애니메이션의 종료 시점을 알 수 있습니다.
extension SwipeNavigationController: UINavigationControllerDelegate {
func navigationController(_ navigationController: UINavigationController,
didShow viewController: UIViewController, animated: Bool) {
duringPushAnimation = false
}
}
swift에서 자주 등장하는 delegate에 대해 알아봤습니다.
감사합니다.