ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [ios/Swift] TableView 에서 delegate pattern 사용하기
    Study/ios 2023. 3. 26. 16:48

    델리게이트 패턴은 객체의 위임을 통해 다른 위치에 있는 기능을 사용할 수 있게 해준다.

     

    시작하기에 앞서 델리게이트 패턴이 왜 쓰이고 선호되는지 정리해 보겠다.

    1. 인터페이스를 통해 다른 객체에게 특정 작업을 위임하기 때문에 객체간 의존도가 낮아진다. (낮은 결합도)

    2. 이벤트를 델리게이트 객체에게 전달하고 처리하면 이벤트에 대한 응답이 캡슐화 하고 이벤트 처리 로직을 분리할 수 있다. (높은 응집도)

    3. 객체의 동작을 커스터마이징하고 확장하기 용이하다.

     

    이 밖에도 델리게이트 패턴을 쓰는 이유는 많은데 단점보다 장점이 훨씬 많은 친구이기 때문에 쓰는 것을 선호한다.

     

    이번에는 테이블 뷰 셀의 버튼을 눌렀을 때 이벤트를 델리게이트 패턴을 통해 구현하였다.

    1. 나의 테이블 뷰 셀은 버튼과 레이블로 구성되어 있고 커스텀 클래스에 연결했다.

    import UIKit
    
    class MainDoingCell: UITableViewCell {
        // 각 셀의 인덱스
        var index: Int?
        
        @IBOutlet var btnCheck: UIButton!
        @IBOutlet var lblDoing: UILabel!
        
        // 버튼 액션 메소드
        @IBAction func onCheckButton(_ sender: UIButton) {
         
        }
        
    }

     

    2. 프로토콜을 선언하고 프로토콜에 따른 delegate변수선언, 그리고 버튼 액션시 프로토콜 발동

    import UIKit
    
    // 프로토콜 선언
    protocol TableViewCellDelegate: AnyObject {
        func didTapButton(cellIndex: Int?, button: UIButton?)
    }
    
    class MainDoingCell: UITableViewCell {
        // 각 셀의 인덱스
        var index: Int?
        
        // 델리게이트 사용을 위한 변수 선언
        weak var delegate: TableViewCellDelegate?
        
        @IBOutlet var btnCheck: UIButton!
        @IBOutlet var lblDoing: UILabel!
        
        // 버튼 액션시 프로토콜 발동
        @IBAction func onCheckButton(_ sender: UIButton) {
            self.delegate?.didTapButton(cellIndex: index, button: btnCheck)
        }
        
    }

     

    3. 테이블 뷰과 포함되고 사용될 클래스에 위 델리게이트를 채택

    import UIKit
    
    class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate, TableViewCellDelegate {
    
    }

     

    4. 테이블 뷰를 사용하기 위해 꼭 필요한 메소드(cell을 구성하는)에서 cell커스텀 클래스 객체의 delegate변수를 자신으로 지정

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
            
            let cell = tableView.dequeueReusableCell(withIdentifier: "MainDoingCell") as! MainDoingCell
            
            cell.delegate = self
            
            return cell
        }

     

    5. 델리게이트 프로토콜을 정의하고 원하는데로 구현

    func didTapButton(cellIndex: Int?, button: UIButton?) {
    	// 원하는 기능 구현
        // 나같은 경우는 클릭된 버튼 셀의 index를 받아와 그 셀의 버튼 텍스트를 변경
    }
Designed by Tistory.