addTarget(_:action:for:)
- 사용 대상: 주로 UIKit의 UIControl 객체(UIButton, UISwitch, UITextField 등)에 사용됩니다.
- 사용법: 특정 이벤트(TouchUpInside, ValueChanged 등)에 대한 동작을 설정합니다.
구문
control.addTarget(target, action: #selector(methodName), for: .event)
매개변수
- target: 이벤트가 발생했을 때 호출될 메서드가 있는 객체
- action: 호출할 메서드(Selector)
- for: 이벤트 종류(UIControl.Event)
ex)
let button = UIButton(type: .system)
button.setTitle("Press Me", for: .normal)
button.addTarget(self, action: #selector(buttonTapped), for: .touchUpInside)
@objc func buttonTapped() {
print("Button was tapped!")
}
장점
- 더 구체적인 이벤트(touchDown, valueChanged 등)을 처리할 수 있음
- UIKit의 다양한 UIControl 이벤트와 호환
addAction(_:)
- 사용 대상: SwiftUI와 UIKit의 UIbutton, UIBarButtonItem, 또는 UIMenu 등의 일부 객체에서 사용 가능합니다.
- 사용법: 클로저 기반으로 동작을 연결합니다(Swift 5.3이상)
구문
control.addAction(UIAction(handler: { action in
}), for: .event)
매개변수
ex)
let button = UIButton(type: .system)
button.setTitle("Press Me", for: .normal)
button.addAction(UIAction(handler: { _ in
print("Button was tapped!")
}), for: .touchUpInside)
장점
- 클로저 기반이므로 더 간결하고, 해당 동작이 @objc 메서드일 필요 없음
- 메서드 분리 없이 코드의 가독성을 유지

UIAction
- iOS 14 이상에서 사용할 수 있는 새로운 API로, 이벤트 처리와 관련된 동작을 클로저로 정의할 수 있게 해줍니다. 이전의 @objc 메서드 기반 처리 방식인 addTarget(_:action:for:)에 비해 코드가 더 간결하고, 가독성이 좋아졌습니다.
UIAction 개요
- UIAction은 사용자 인터페이스에서 발생하는 이벤트(버튼 탭, 메뉴 선택 등)에 대한 클로저로 정의할 수 있는 클래스입니다.
UIAction의 주요 속성
- title: 액션의 제목
- image: 액션과 연관된 아이콘 이미지
- handler: 이벤트가 발생했을 때 실행될 클로저
- identifier: 액션을 고유하게 식별하기 위한 값
- discoverabilityTitle: 보조 설명 텍스트(VoiceOver 등에서 유용)
UIAciton 생성
구문
let action = UIAction(title: "Title", image: UIImage(named: "icon"), identifier: nil, handler: { _ in
})
ex)
let button = UIButton(type: .system)
button.setTitle("Tap Me", for: .normal)
button.addAction(UIAction(handler: { _ in
print("Button was tapped!")
}), for: .touchUpInside)
UIAction의 장점
- 클로저 기반: @objc 메서드 없이 동작 정의 가능
- 간결한 코드: 액션과 이벤트 처리가 한곳에 작성되어 관리가 쉬움
- 다양한 UI 요소에서 사용 가능: UIButton, UIBarButtonItem, UIMenu 등
- 유연성: 메뉴와 같은 복합 인터페이스에도 적용 가능
- iOS 14 이상을 타겟으로 하는 프로젝트라면 UIAction을 사용하는 것이 권장됩니다.
- 기존 방식(addTarget)은 여전히 유효하므로, 하위 호환성을 고려할 경우 적절히 혼용할 수 있습니다.