티스토리 뷰

반응형
SMALL

이번 포스트에서는 Delegate 패턴을 사용하여 View와 View Controller 간의 이벤트 전달 및 데이터 전달 방법에 대해 살펴보겠습니다.

Delegate 패턴은 Protocol을 사용하여 구현하게 됩니다.

 

Protocol에 대해 간단하게 정리해보자면, 사람이라는 Protocol을 정의했다고 가정해봅시다.

protocol Person {

    func sayHello()

    func eat()

}

위 예시 코드를 보면 인사를 하다먹다 라는 두 function이 정의되어 있습니다.

그러면 저 Person이라는 Protocol을 구현하는 Class를 하나 만들어 보겠습니다.

class DennyKim: Person {
    func sayHello() {
        print("Hello My name is denny.")
    }
    
    func eat() {
        print("I Eat Cake")
    }
}

해당 프로토콜을 구현하는 클래스에서 함수를 구현하게 됩니다.

이렇듯 일종의 규약을 만드는 것을 Protocol이라고 합니다. 프로토콜에 대한 내용은 별도의 포스트로 정리해보도록 하겠습니다.

 

Delegate

Delegate는 아래와 같은 뜻을 지니고 있습니다.

1. (집단의 의사를 대표하는) 대표(자)

2. (권한 / 업무 등을) 위임하다

3. (대표자 등을) 뽑다

 

Delegate라는 것은 객체 지향 프로그래밍에서 하나의 특정 객체가 모든 일을 처리하는 것이 아니라 처리 해야    일부 작업을 다른 객체에 넘기는 것을 합니다.

View Controller에서 보자면 TableView의 특정 셀에 있는 여러 개의 버튼 중에 특정 버튼을 눌렀을 경우 해야할 일을 View Controller로 넘겨주기 위해 Delegate 패턴을 사용합니다.

TableView Cell을 활용한 Example Code

예시를 한 번 보면 이해가 빠를 것 같습니다.

다음과 같은 구조로 View가 구성된다고 가정해봅시다.

TableViewCell이 선택되었을 때 호출하는 기능은 TableView Delegate에서 기본적으로 처리를 하고 있습니다만, 내부의 특정 버튼에 대한 이벤트는 처리할 수 없습니다.

이 경우 커스텀 Delegate를 만들어서 구현할 수 있습니다.

 

우선 View Controller의 코드입니다.

protocol ResultTableViewButtonDelegate {
    func didSelectPositionButton(item: ResultStore?)
}

class ViewController: UIViewController {

}

extension ViewController: ResultTableViewButtonDelegate {
    func didSelectPositionButton(item: ResultStore?) {
        let storyboard = self.storyboard
        let positionVC = storyboard?.instantiateViewController(withIdentifier: "positionVC") as! PositionViewController
        positionVC.item = item
        self.navigationController?.pushViewController(positionVC, animated: true)
    }
}

extension ViewController: UITableViewDelegate, UITableViewDataSource {
    ...
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "resultStoreCell", for: indexPath) as! ResultTableViewCell
        
        cell.item = self.presenter.getStoreFromList(index: indexPath.row)
        cell.selectionStyle  = .none
        cell.delegate = self
        
        return cell
    }
    
    ...
}

ResultTablerViewButtonDelegate라는 이름의 Custom Delegate를 구현하였습니다.

다음은 TableView Cell의 코드입니다.

class ResultTableViewCell: UITableViewCell {
    ...
    var item: ResultStore? {
        didSet {
            ...
        }
    }
    
    var delegate: ResultTableViewButtonDelegate?
    
    @IBAction func onClickPositionBtn(_ sender: UIButton) {
        delegate?.didSelectPositionButton(item: self.item)
    }
    ...
}

delegate를 선언하고 호출하는 코드가 담겨있습니다.

 

순서대로 동작하는 과정을 나열하자면 다음과 같습니다.

1. TableView Cell을 정의할 때 delegate를 할당해준다.

    cell.delegate = self

2. TableView Cell안에 있는 UIButton의 클릭 이벤트 발생 시 IBAction 함수가 호출된다 (onClickPositionBtn)

3. 각 TableView Cell은 item을 가지고 있으며 이 item을 delegate method의 인자값으로 넘겨준다.

    delegate?.didSelectPositionButton(item: self.item)

4. ViewController에서 구현되어 있는 delegate 함수가 호출되며 해당 함수 안에서 받아온 데이터로 작업을 수행.

 

그림으로 나타나면 아래 그림과 같습니다.

 

코드를 천천히 살펴보면서 이해하려고 한다면, 쉽게 이해하실 수 있으실 것입니다.

질문이 있다면 연락해주시면 설명드리도록 하겠습니다.

 

이번 포스트에서는 Swift로 구현하는 Delegate 패턴에 대해 살펴보았습니다.

 

반응형
LIST

'프로그래밍언어 > Swift' 카테고리의 다른 글

[Swift] Codable을 사용하여 JSON Encode/Decode 하기  (0) 2020.03.17
Swift 클로저 (Closure)  (0) 2020.02.23
Swift 함수  (0) 2020.02.23
Swift 메모리 안정성  (0) 2020.02.16
Swift 제어문 (조건문, 반복문)  (0) 2020.02.14
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   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
글 보관함