개발_:)새발
[Swift] Target-Action 디자인 패턴 본문
# Target-Action 디자인 패턴
arget-Action 디자인 패턴에서 객체는 이벤트가 발생할 때 다른 객체에 메시지를 보내는 데 필요한 정보를 포함합니다. 액션은 특정 이벤트가 발생했을 때 호출할 메서드를 의미합니다. 그리고 타깃은 액션이 호출될 객체를 의미합니다. 이벤트 발생 시 전송된 메시지를 액션 메시지라고 하고, 타깃은 프레임워크 객체를 포함한 모든 객체가 될 수 있으나, 보통 컨트롤러가 되는 경우가 일반적입니다.
# 액션 메서드
액션 메서드는 특정한 양식이 필요합니다. IBAction은 인터페이스 빌더가 메서드를 인지할 수 있도록 해줍니다. 스위프트 언어를 활용한 프로그래밍 방식에서 @objc는 Swift 클래스를 사용하는 Objective-C 코드가 있거나 Objective-C유형의 메서드를 사용하는 경우 필요합니다.
// 프로그래밍 방식
@objc func doSomething(_ sender: Any) {
}
// 인터페이스 빌더
@IBAction func doSomething(_ sender: Any) {
}
# 컨트롤 이벤트와 액션과의 관계
UIKit에는 `UIButton`, `UISwitch`, `UIStepper` 등 `UIControl`을 상속받은 다양한 컨트롤 클래스가 있습니다. 그런 컨트롤 객체에 발생한 다양한 이벤트 종류를 특정 액션 메서드에 연결할 수 있습니다. 즉, 컨트롤 객체에서 특정 이벤트가 발생하면, 미리 지정해 둔 타깃의 액션을 호출하게 됩니다.
컨트롤 이벤트의 종류
컨트롤 이벤트는 `UIControlEvents`라는 타입으로 정의되어 있습니다. 아래는 컨트롤 객체에 발생할 수 있는 이벤트의 종류입니다.
- touchDown
- 컨트롤을 터치했을 때 발생하는 이벤트
- UIControlEvents.touchDown
- touchDownRepeat
- 컨트롤을 연속 터치 할 때 발생하는 이벤트
- UIControlEvents.touchDownRepeat
- touchDragInside
- 컨트롤 범위 내에서 터치한 영역을 드래그할 때 발생하는 이벤트
- UIControlEvents.touchDragInside
- touchDragOutside
- 터치 영역이 컨트롤의 바깥쪽에서 드래그 할 때 발생하는 이벤트
- UIControlEvents.touchDragOutside
- touchDragEnter
- 터치 영역이 컨트롤의 일정 영역 바깥쪽으로 나갔다가 다시 들어왔을 때 발생하는 이벤트
- UIControlEvents.touchDragEnter
- touchDragExit
- 터치 영역이 컨트롤의 일정 영역 바깥쪽으로 나갔을 때 발생하는 이벤트
- UIControlEvents.touchDragExit
- touchUpInside
- 컨트롤 영역 안쪽에서 터치 후 뗐을때 발생하는 이벤트
- UIControlEvents.touchUpInside
- touchUpOutside
- 컨트롤 영역 안쪽에서 터치 후 컨트롤 밖에서 떴을 때 이벤트
- UIControlEvents.touchUpOutside
- touchCancel
- 터치를 취소하는 이벤트 (touchUp 이벤트가 발생되지 않음)
- UIControlEvents.touchCancel
- valueChanged
- 터치를 드래그 및 다른 방법으로 조작하여 값이 변경되었을때 발생하는 이벤트
- UIControlEvents.valueChanged
- primaryActionTriggered
- 버튼이 눌릴때 발생하는 이벤트 (iOS보다는 tvOS에서 사용)
- UIControlEvents.primaryActionTriggered
- editingDidBegin
- `UITextField`에서 편집이 시작될 때 호출되는 이벤트
- UIControlEvents.editingDidBegin
- editingChanged
- `UITextField`에서 값이 바뀔 때마다 호출되는 이벤트
- UIControlEvents.editingChanged
- editingDidEnd
- `UITextField`에서 외부 객체와의 상호작용으로 인해 편집이 종료되었을 때 발생하는 이벤트
- UIControlEvents.editingDidEnd
- editingDidEndOnExit
- `UITextField`의 편집상태에서 키보드의 `return` 키를 터치했을 때 발생하는 이벤트
- UIControlEvents.editingDidEndOnExit
- allTouchEvents
- 모든 터치 이벤트
- UIControlEvents.allTouchEvents
- allEditingEvents
- `UITextField`에서 편집작업의 이벤트
- UIControlEvents.allEditingEvents
- applicationReserved
- 각각의 애플리케이션에서 프로그래머가 임의로 지정할 수 있는 이벤트 값의 범위
- UIControlEvents.applicationReserved
- systemReserved
- 프레임워크 내에서 사용하는 예약된 이벤트 값의 범위
- UIControlEvents.systemReserved
- allEvents
- 시스템 이벤트를 포함한 모든 이벤트
- UIControlEvents.allEvents
# 예시 코드
import UIKit
class ViewController: UIViewController {
let button: UIButton = {
let button = UIButton()
button.setTitle("버튼", for: .normal)
button.setTitleColor(.black, for: .normal)
return button
}()
override func viewDidLoad() {
super.viewDidLoad()
button.addTarget(self, action: #selector(buttonAction), for: .touchUpInside)
view.addSubview(button)
button.translatesAutoresizingMaskIntoConstraints = false
button.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
button.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
}
@objc func buttonAction(_ button: UIButton) { print("버튼이 눌렸습니다.") }
}
1. 먼저 일반적인 ViewController의 View 위에 UIButton 타입의 프로퍼티를 만들어줍니다.
(화면에 보여주는 부분에 대한 설명은 생략하겠습니다: Autolayout)
2. 해당 버튼 프로퍼티에 addTarget 을 통해서 Target과 Action을 정해줍니다.
여기서 Target은 호출되는 객체인 ViewController (self)를 의미하며, Action은 호출되는 메서드를 의미합니다
3. 마지막 하단에 있는 @objc func buttonAction 은 이벤트가 발생했을 때 호출되는 메서드입니다.
@objc는 Swift에서 Objective-C 유형의 메서드를 사용하는 경우 명시적으로 표시해줘야 합니다.
addTarget (for: ) 부분에는 UIControlEvent의 종류를 선택해서 입력해줘야 합니다. 종류는 굉장히 다양하고 위 샘플 코드에서 사용된 종류는 touchUpInside입니다. touchUpInside는 컨트롤 영역 안쪽에서 터치 후 뗐을때 발생하는 이벤트입니다.
'iOS > swift' 카테고리의 다른 글
[Swift] 동시성 프로그래밍과 비동기 프로그래밍 (0) | 2019.09.03 |
---|---|
[Swift] 제스처 인식기(Gesture Recognizer) (0) | 2019.08.12 |
[Swift] Singleton 디자인패턴 (0) | 2019.08.12 |
[Swift] Delegation 디자인 패턴 (0) | 2019.08.12 |
[Swift] 화면 전환 [3/3] (Segue) (0) | 2019.08.12 |