
(delegate 선언시에 weak으로 선언 _ 메모리 누수 방지)
개발하는동안 계속 감이 오지 않았던.. Delegate에 대해서 알아봅시다.
Delegate는 단순히 '프로토콜' 아닌가?
맞는말이긴 하지만 더자세히 알아야한다.
우선 Delegate의 사전적인 의미는 대리자, 중매자이다
Swift에서는 쉽게 해석하면 대신맨이다. (일을 대신해주는 사람)
코드로 이해해보자
우선 Delegate를 쓰려면 프로토콜이기 때문에 채택을 진행한다. (UITextFieldDelegate)
class SampleViewController: UIViewController, UITextFieldDelegate {
override func viewDidLoad() {
super.viewDidLoad()
}
}
텍스트필드에서 입력한것을 라벨에 나타내야하므로
입력칸이 될 testTextField와 출력부가 될 testLabel을 선언해준다.
lazy var testLabel: UILabel = {
let label = UILabel()
return label
}()
lazy var testTextField: UITextField = {
let textField = UITextField()
textField.borderStyle = .bezel
textField.placeholder = "여백"
return textField
}()
UITextFieldDelegate를 채택하면 사용 할수 있는 함수가 있다.
바로 textFieldShouldReturn
해당함수는 텍스트필드에서 return키를 누르면 실행되는 함수이다.
함수를 활용하여 입력된 텍스트값을 label에 전달해본다.
testLabel.text = textField.text를 보면 입력된 텍스트값이 label로 전달되고있다.
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
testLabel.text = textField.text
return true
}
이렇게되면 끝일까? 제일 중요한 부분이 남아있다
이부분이 Delegate를 사용하는 이유이자 절대 놓치면 안되는 코드이다.
Delegate의 역할은 "클랙스의 책임을 다른 인스턴스에 위임한다" 이다.
그렇다면 역할을 누구한테 넘겨줄 것인가?
의역하면 선언하였던 testTextField의 Delegate는 self가 할것
self는 바로 SampleViewContoller이다.
정리해서 얘기하면 testTextField의 역할 수행의 대신맨(대리자)은 바로 SampleViewContoller이고
그역할은 textFieldShouldReturn함수 이다.
testTextField.delegate = self
전체코드
import UIKit
import SnapKit
class SampleViewController: UIViewController, UITextFieldDelegate {
lazy var testLabel: UILabel = {
let label = UILabel()
label.text = "label입니다."
return label
}()
lazy var testTextField: UITextField = {
let textField = UITextField()
textField.borderStyle = .bezel
textField.placeholder = "여백"
return textField
}()
override func viewDidLoad() {
super.viewDidLoad()
setUpView()
setLayout()
testTextField.delegate = self
}
func setUpView() {
view.addSubview(testLabel)
view.addSubview(testTextField)
}
func setLayout() {
testLabel.snp.makeConstraints {
$0.top.equalTo(view.safeAreaLayoutGuide.snp.top).offset(30)
}
testTextField.snp.makeConstraints {
$0.top.equalTo(testLabel.snp.bottom).multipliedBy(1.2)
}
}
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
testLabel.text = textField.text
return true
}
}
'Swift(IOS)' 카테고리의 다른 글
| [내용정리] Swift - closure(클로저)란? (1/2) (0) | 2022.02.03 |
|---|---|
| [내용정리] Swift - UITableVIew Delegate, DataSource 종류 (0) | 2022.01.26 |
| [내용정리] Swift - 코드로(Programmatically) 검색기능 구현 (0) | 2022.01.13 |
| [내용정리] Swift - URLSession 이란? (0) | 2022.01.11 |
| [오류처리] Swift - Add a new account in the Accounts preference pane or verify that your accounts have valid credentials. (0) | 2022.01.04 |