런타임에 UIBarButtonItem의 타겟(Target)과 액션(Action) 설정하기
iOS 개발을 하다 보면 UIBarButtonItem의 타겟과 액션을 코드로 동적으로 설정해야 하는 경우가 종종 있습니다. 이 글에서는 런타임에 내비게이션 바에 버튼을 추가하고, 해당 버튼에 액션을 연결하는 방법을 단계별로 살펴보겠습니다.
1. 새 프로젝트 생성 및 내비게이션 컨트롤러 임베드
먼저 Xcode에서 새 프로젝트를 생성합니다. 프로젝트가 만들어지면 스토리보드로 이동하여 ViewController를 선택한 뒤, Editor → Embed In → Navigation Controller 메뉴를 통해 내비게이션 컨트롤러 안에 임베드합니다.
2. 버튼이 눌렸을 때 호출될 함수 작성
이제 해당 뷰 컨트롤러 클래스로 이동하여, 버튼이 눌렸을 때 호출될 @objc 함수를 하나 만듭니다.
@objc func barButtonAction() {
print("Button pressed")
}3. viewWillLayoutSubviews에서 바 버튼 생성하기
클래스에 viewWillLayoutSubviews 메서드를 추가하고, 그 안에서 다음 순서대로 코드를 작성합니다.
먼저 바 버튼 인스턴스를 생성합니다.
let barButton = UIBarButtonItem()
다음으로 버튼에 표시될 타이틀을 지정합니다.
barButton.title = "custom"
그다음 셀렉터(#selector)를 사용해 커스텀 액션을 연결하고, 타겟을 self로 설정합니다.
barButton.action = #selector(barButtonAction) barButton.target = self
마지막으로 완성된 버튼을 애플리케이션의 내비게이션 바에 추가합니다.
self.navigationItem.setLeftBarButton(barButton, animated: true)
4. 전체 코드 정리
지금까지 작성한 내용을 모두 합치면 전체 코드는 다음과 같습니다.
override func viewWillLayoutSubviews() {
let barButton = UIBarButtonItem()
barButton.title = "custom"
barButton.action = #selector(barButtonAction)
barButton.target = self
self.navigationItem.setLeftBarButton(barButton, animated: true)
}
@objc func barButtonAction() {
print("Button pressed")
}5. 실행 결과 확인
기기나 시뮬레이터에서 위 코드를 실행하면 내비게이션 바 왼쪽에 "custom"이라는 버튼이 나타납니다. 이 버튼을 여러 번 누르면 콘솔에 아래와 같이 로그가 출력되는 것을 확인할 수 있습니다.


참고: 실제 프로젝트에서는 viewWillLayoutSubviews 대신 viewDidLoad에서 버튼을 한 번만 설정하는 것이 좋습니다. viewWillLayoutSubviews는 레이아웃이 변경될 때마다 반복적으로 호출되므로, 불필요하게 버튼 설정 코드가 여러 번 실행될 수 있기 때문입니다.