델리게이트 패턴에 대해서 알아보자!.

2022. 11. 20. 12:52iOS

셀에서의 버튼 액션을 사용할 수 없기 때문에 이 부분을 컨트롤러에 전해줘야 합니다.

이 부분을 실행하는 데에 있어 다른 방법도 있겠지만 델리게이트 패턴을 사용하기에 델리게이트 패턴에 대해 알아보도록 하겠습니다.

 

 

@IBOutlet weak var addButton: UIButton!

addButton.addTarget(self, action: #selector(add), for: .touchUpInside)

 

  @objc func add(sender: UIButton) {

}

우선은 버튼을 생성한 상태에서 연결을 진행한 후에 

addtarget을 진행하여 액션을 실행할 함수를 만들어 줬습니다.

 

이 부분이 실행되는 부분은 컨트롤러가 아닌 셀에서 진행되고 있음을 설명드립니다.!

그렇기에 add 함수에 액션 명령을 하달하더라도 이 부분이 컨트롤러로 전달되어지지 않기 때문에 버튼 액션을 실행이 되지 않습니다.!

그래서 이 부분을 실행하기 위해서 델리게이트 패턴을 사용했습니다.!

 

protocol AddButtonDelegate: AnyObject {

    func addTaget()

}

먼저 델리게이트 패턴을 사용할 수 있게 프로토콜을 채용합니다.! ( 셀에서 생성을 진행했습니다.!)

 

이후 weak var delegate: AddButtonDelegate? 델리게이트를 채용합니다. weak를 사용한 이유는 충돌을 방지하기 위해서입니다.!

 

테이블 뷰 셀

 

protocol AddButtonDelegate: AnyObject {

    func addTaget()

}

class TableViewCell: UITableViewCell {

weak var delegate: AddButtonDelegate?

 

 @objc func add(sender: UIButton) {

        delegate?.addTaget() 

}   액션 함수에 델리게이트를 사용할 수 있게 넣어줍니다.

 

 

 뷰 컨트롤러

extension ViewController: AddButtonDelegate {

    func addTaget() {

        let storyboacrd = UIStoryboard.init(name: "PopUpView", bundle: nil)

        let popUpVC = storyboacrd.instantiateViewController(withIdentifier: "PopUpView") as! PopUpView

        popUpVC.modalPresentationStyle = .overCurrentContext

        popUpVC.modalTransitionStyle = .crossDissolve

        self.present(popUpVC, animated: true)

    }

}

컨트롤러로 돌아와서 추가적으로 델리게이트를 채용하고 버튼 입력 시 사용할 액션을 작성합니다.

 

뷰 컨트롤러

 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        guard let cell = tableView.dequeueReusableCell(withIdentifier: "TableViewCell", for: indexPath) as? TableViewCell else { fatalError() }

cell.delegate = self // 셀프로 알린다.

return cell

이후 델리게이트 패턴을 구현했다는 것을 셀프로 알리면 셀에서의 버튼 액션이 컨트롤러로 전달되어 액션 함수가 실행이 됩니다.