Target-Action Pattern
- 이벤트가 발생할 때 다른 객체에 메시지를 보내는 데 필요한 정보를 포함
- 액션
- 특정 이벤트가 발생했을 때 호출할 메서드를 의미
- 타겟
- 액션이 호출될 객체를 의미, 프레임워크 객체를 포함한 모든 객체가 될 수 있으나, 보통 컨트롤러가 담당한다!
- 만약 타켓이 nil이라면? Responde chain을 따라서 이벤트(action)을 처리하기에 적합한 리스폰더 객체를 찾아나선다!
If you specify nil, UIKit searches the responder chain for an object that responds to the specified action message and delivers the message to that object.
about. UIResponder [iOS] UIResponder
Target과 Action에대한 예시
- 아래의 예시는 textfield의 extension을 통하여 toolBar를 생성하는 코드이다.
// viewController 밖
extension UITextField {
func addDoneButtonToKeyboard(myAction: Selector?){
....
let done: UIBarButtonItem = UIBarButtonItem(title: "Done", style: UIBarButtonItem.Style.done, target: nil, action: myAction)
....
}
- 그리고 아래는 해당 메소드를 호출하는 코드이다.
// viewController 안
override func viewDidLoad() {
...
ageTextField.addDoneButtonToKeyboard(myAction: #selector(moveToNextTextField))
}
// @objc 메소드 정의
@objc func moveToNextTextField() {
ageTextField.resignFirstResponder()
phoneNumberTextField.becomeFirstResponder()
}
- 위 코드의 경우, BarButtonItem에서 타켓을 nil로 설정하였다. 따라서 Responder Chain을 따라서 viewController내에 있는 @objc 메소드인 moveToNextTextField() 를 action으로 잘 받을 수 있다.
- 그러나, 만약 target을 self로 받는다면?
- self → UITextField로 설정이된다. 그러나, myAction으로 받는 메소드는 viewController scope에 있기에 해당 target은 action을 호출할 수 없다.
같은 의미에서 아래의 코드를 이해해보자.
// viewController 밖
extension UITextField {
func addHyphenAndDoneButtonToKeyboard(doneAction: Selector?, plusHyphenAction: Selector?){
...
let done: UIBarButtonItem = UIBarButtonItem(title: "Done", style: UIBarButtonItem.Style.done, target: self, action: doneAction)
}
- 그리고 아래는 위 메소드의 호출부이다.
// viewController 안
override func viewDidLoad() {
...
phoneNumberTextField.addHyphenAndDoneButtonToKeyboard(doneAction: #selector(phoneNumberTextField.resignFirstResponder), plusHyphenAction: #selector(plusHyphen))
...
}
- 위 코드는 바로 위의 예시와는 다르게 target을 self로 설정되어있고, 따로 @objc 메소드를 설정해주지 않다.
- 따라서 self ⇒ UIextField로 설정되어있고, 같은 scope에 있는 texfield 메소드인 phoneNumberTextField.resignFirstResponder 가 제대로 호출이된다.
@IBAction과 @objc
- @IBAction
- 인터페이스 빌더가 메서드를 인지할 수 있도록 한다.
- @objc
- Objective-C 코드임을 알려준다.
📚참고
'iOS' 카테고리의 다른 글
[iOS] TableView에서 Swipe해서 Delete하기 (0) | 2023.02.09 |
---|---|
[iOS] sizeToFit()과 ToolBar (0) | 2023.02.09 |
[iOS] UIResponder (0) | 2023.02.06 |
[iOS] CGPoint, CGSize, CGRect (0) | 2023.02.06 |
[iOS] TextField 왼쪽 여백 넣기 (0) | 2023.02.06 |