2016년 1월 6일 수요일

swift delegate 이해하기

간단하게 swift delegate 를 이해하기


C 프로그래머 입장에서 그냥 간단하게 콜백함수로 이해 하는게 가장 쉽다.

언제쓰냐?

간단하게 예제를 생각해 보면

ViewController에 TextFiled가 있다. 날짜만 입력 받아야 하는 경우

여기 편집이 시작되면 keyboard가 아니라 PickerView가 나오고
여기서 선택된 row가 TextField에 입력 되야 한다.




대충 위와 같은 디자인 
이것은 ViewController 위에 Black 컬러에 20%투명을 준 전체 화면 View에 하단에  DatePicker 그리고 Cancel, Done 버튼을 지닌 별도의 View를 위에 언지는 것이다.



PickerView 가 같은 ViewController에 존재 한다면 문제가 없지만
PickerView를 디자이너님 입맛에 맡도록 별도의 View로 만들고 별도의 View class 코드가 존재 한다면


addSubView 로 이미 PickerView가 add되어 있고 ViewController에서 hidden으로 존재 하다가
TextField가 편집 시작되면 keyboard대신 hidden 속성을 false로 해서 나오게 한다.


    func textFieldShouldBeginEditing(textField: UITextField) -> Bool {
        datePickerView.hidden = false
    }

그러면 datePickerView 라는 pickerview를 가지고 잇는 view가화면에 출력 되었다.
모든 제어가 여기로 넘어가서 날짜를 선택 했다.

그 선택된 문자열이 textField.text에 입력이 되야 한다.

datePickerView.DateString이 결과 값이라고 할때 이것을 언제 어떻게 assign 해야 하나?

이럴때 delegate가 필요 하다.

datePickerView의 클래스

protocol DatePickerViewDelegate {
    func DatePickerDidSetDate()

}

영어가 짧은 관계로 DidSetDate?? 이렇게 delegate 함수 이름을 지었다.

var delegate: DatePickerViewDelegate?
이렇게 deleage를 선언 해준다.

self.DateString = strDate
        delegate?.DatePickerDidSetDate()

picker의 결과를 설정 한 다음 delegate 메서드를 호출 해 준다.

이제 이 View를 이용하는 ViewController Class

class ProfileViewController: UIViewController, UITextFieldDelegate, DatePickerViewDelegate
{
var datePickerView: DatePickerView!

....

datePickerView.delegate = self


...
// MARK : DatePickerViewDelegate
    func DatePickerDidSetDate() {
        birthdayTextField.text = datePickerView.DateString
    }

pickerView에서 델리게이트 함수를 호출해 주면 ViewController에 DatePickerDidDate() 함수가 호출 되고 여기서 TextField.text를 설정 하면 된다.

이런 메카니즘이 UITextFieldDelegate, UITableViewDelegate  등등... 우리가 자주 사용하는 delegate 함수를 작성해야 하던 일을 직접 만든 ViewClass에서 이용하는 방법이다.





댓글 없음: