Notice
Recent Posts
Recent Comments
Link
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
Archives
Today
Total
관리 메뉴

개발_:)새발

[Swift] Target-Action 디자인 패턴 본문

iOS/swift

[Swift] Target-Action 디자인 패턴

sylii_:) 2019. 8. 12. 18:36

# 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는 컨트롤 영역 안쪽에서 터치 후 뗐을때 발생하는 이벤트입니다.

Comments