꾸준히 안타치기
Target-Action 디자인 패턴 본문
Target-Action 디자인 패턴 ( 단순한 액션 ) / 다양한 상황에 맞게 할때는 - delegate 디자인 패턴 활용
Target-Action 디자인 패턴은 iOS 환경에서 많이 사용하는 디자인 패턴 중 하나입니다. Target-Action 디자인 패턴에서 객체는 이벤트가 발생할 때 다른 객체에 메시지를 보내는 데 필요한 정보를 포함합니다. 액션은 특정 이벤트가 발생했을 때 호출할 메서드를 의미합니다. 그리고 타겟은 액션이 호출될 객체를 의미합니다. 이벤트 발생 시 전송된 메시지를 액션 메시지라고 하고, 타겟은 프레임워크 객체를 포함한 모든 객체가 될 수 있으나, 보통 컨트롤러가 되는 경우가 일반적입니다.
직접 타겟이 될 객체에 액션에 해당하는 메서드를 호출하면 될 텐데 굳이 Target과 Action을 지정하고 디자인 패턴으로 활용하는 이유가 궁금하죠? 왜 그럴까요?
만약 특정 이벤트가 발생했을 때 abc라는 이름의 메서드를 호출해야 하는 상황이라고 생각해 봅시다. 그런데 이 abc라는 (액션)메서드는 A라는 클래스에도 정의되어 있고, B라는 클래스에도 정의되어 있는 경우가 있습니다. 이렇게 같은 메서드가 여러 클래스에 정의되어 있는 경우도 있고, 그런 클래스의 인스턴스가 여러개인 상황도 있습니다. 이런 여러 가지 상황에서 우리가 원하는 객체를 Target으로 지정하면 abc라는 액션을 실행할 객체를 상황에 따라서 선택할 수 있습니다.
액션 메서드
액션 메서드는 특정한 양식이 필요합니다. IBAction은 인터페이스 빌더가 메서드를 인지할 수 있도록 해줍니다. 스위프트 언어를 활용한 프로그래밍 방식에서 @objc는 Swift 클래스를 사용하는 Objective-C 코드가 있거나 Objective-C유형의 메서드를 사용하는 경우 필요합니다.
// 프로그래밍 방식
@objc func doSomething(_ sender: Any) {
}
// 인터페이스 빌더
@IBAction func doSomething(_ sender: Any) {
}
Tip!
아직까지 애플의 프레임워크는 Objective-C 언어로 작성된 코드가 많기 때문에 스위프트 언어로 작성한 코드에서는 Objective-C 코드와 호환하기 위해서 @objc라고 표시해주어야 합니다. 스위프트 언어 4버전 이전의 컴파일러는 @objc를 자동으로 만들어 주었습니다. 하지만 이러한 방식은 자원 비용이 많이 들어 스위프트 4에서는 명시적으로 작성해야 합니다.
컨트롤 이벤트
컨트롤 이벤트와 액션과의 관계
UIKit에는 `UIButton`, `UISwitch`, `UIStepper` 등 `UIControl`을 상속받은 다양한 컨트롤 클래스가 있습니다. 그런 컨트롤 객체에 발생한 다양한 이벤트 종류를 특정 액션 메서드에 연결할 수 있습니다. 즉, 컨트롤 객체에서 특정 이벤트가 발생하면, 미리 지정해 둔 타겟의 액션을 호출하게 됩니다.
컨트롤 이벤트의 종류
컨트롤 이벤트는 `UIControlEvents`라는 타입으로 정의되어 있습니다. 아래는 컨트롤 객체에 발생할 수 있는 이벤트의 종류입니다.
- touchDown
- touchDownRepeat
- touchDragInside
- touchDragOutside
- touchDragEnter
- touchDragExit
- touchUpInside
- touchUpOutside
- touchCancel
- valueChanged
- primaryActionTriggered
- editingDidBegin
- editingChanged
- editingDidEnd
- editingDidEndOnExit
- allTouchEvents
- allEditingEvents
- applicationReserved
- systemReserved
- allEvents
https://www.boostcourse.org/mo326/lecture/16854?isDesc=false
'iOS > Basic Study' 카테고리의 다른 글
URLSession과 URLSessionDataTask (0) | 2021.12.27 |
---|---|
OperationQueue (0) | 2021.12.26 |
tableView +Json 데이터 파싱 (0) | 2021.12.23 |
Delegation이란? (0) | 2021.12.19 |
뷰의 상태변화 감지 메서드 (0) | 2021.12.19 |