[UIKit] 테이블뷰 셀안에 있는 버튼 클릭 이벤트 처리하기 (자세히) -델리게이트 패턴

2022. 9. 1. 02:07SWIFT/UIKit

728x90
반응형

테이블뷰 클릭이벤트만들기 (참고)

 

 

 

테이블뷰셀에 있는 버튼 클릭이벤트 만들기

테이블뷰셀파일에서 IBAction을 만들어준다

 

 

셀을 클릭하면 뷰컨트롤러에서 설정해준 셀클릭이벤트 함수가 호출되고

버튼을 클릭하면 테이블뷰셀에서 설정해준 IBAction 함수가 호출된다.

하지만 버튼을 클릭해도 뷰컨틀롤러에서는 버튼일 클릭되었는 지 알 수가 없다. 이를 델리게이트로 연결해보자!

 

지금 내가 하고 싶은 일은

테이블뷰셀에서 이벤트가 발생했을 때 뷰컨트롤러에서 알게 하는 것이다.

 

1. 연결시켜줄 프로토콜을 만든다

파일을 생성하여 프로토콜 파일을 만들어준다.

 

 

2. 테이블뷰가 있는 뷰컨트롤러에서 프로토콜을 연결시킨다

프로토콜을 추가해주면 함수를 정의하라는 오류 메시지가 나온다. fix버튼을 클릭하면

정의부가 나온다.

함수를 정의해준다.

 

테이블뷰셀안에 버튼이 있기때문에 나의 프로토콜은 테이블뷰셀을 선언해주는 곳에서 셀프로토콜과 연결시켜준다.

 

여기까지가 이제 이벤트를 발생했을 때 받을 준비가 된 것이다.

이제 테이블뷰셀과 연결을 시켜줘야한다.

 

 

3. 버튼이 있는 테이블뷰셀과 연결시킨다

프로토콜을 옵셔널타입으로 선언해준다

 

버튼이 클릭될 때 이벤트를 발생시켜준다!

 

 

 

실행

셀을 클릭하게 되면 

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        //테이블뷰의 이벤트처리 함수
        print("테이블뷰 셀이 클릭 되었다!")
    }

뷰컨트롤러에 있는 이 함수가 실행되고

 

테이블뷰 셀의 버튼을 클릭하게 되면

    @IBAction func btnAction(_ sender: Any) {
        print("테이블뷰셀에 있는 버튼이 클릭되었따.")
        
        myprotocol?.myTableViewCellBtnAction()
    }

테이블뷰셀 파일에 있는 프린트가 실행되고

    //델리게이트 메소드
    func myTableViewCellBtnAction() {
        print("뷰컨트롤러에서 버튼이 클릭되었다.")
    }

프로토콜로 연결된 델리게이트 메소드가 호출이 된다. (뷰컨트롤러에 있는 함수 -테이블뷰가 선언되어 있는 뷰컨트롤러)

 

 

 

 


정리

B에서 이벤트가 발생했을 때 A에게 알려주고 싶을 때!

1. 프로토콜을 만든다

protocol myProtocol {
    func myTableViewCellBtnAction()
}

 

2. B에서 프로토콜 객체를 생성한다

    var myprotocol : myProtocol?

 

3. B에서 이벤트가 발생하는 지점에서 함소를 호출시킨다

    @IBAction func btnAction(_ sender: Any) {
        print("테이블뷰셀에 있는 버튼이 클릭되었따.")
        
        myprotocol?.myTableViewCellBtnAction()
    }

 

4. A에서 프로토콜을 받는다

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, myProtocol

 

5. 함수를 구현해준다

(프로토콜을 상속받으면 자동으로 구현하라는 경고메시지가 뜬다. fix 버튼을 누르면 자동으로 생성)

    func myTableViewCellBtnAction() {
        print("뷰컨트롤러에서 버튼이 클릭되었다.")
    }

 

6. 자기 자신과 연결시켜준다

        cell.myprotocol = self

여기서 나는 테이블뷰셀과 연결을 시켰기때문에 UITableViewCell에 자기자신과 연결된다

ViewConroller와 연결시킬때는 뷰컨트롤러에서 자기자신과 연결시키면 된다

 

 

 

 

 

728x90
반응형