iOS/UIKit

[IOS] UITableView (UITableViewDataSource, UITableViewDelegate)

유훈 | Yuhun 2022. 2. 3. 03:11
반응형

UITableView의 사용법에 대해서 알아보겠습니다.

 

TavbleView를 @IBOulet으로 받아와주고 사용하면 되는데 TavbleView를 사용하는 뷰컨트롤러에

UITableViewDataSource와 UITableViewDataSource 프로토콜을 채택해 데이터를 다루고 셀을 조절할 수 있습니다.

프로토콜 채택은 다음 두가지 방법이 있습니다. (사실 똑같은 내용인데 가독성 차이가 있습니다.)

1. 뷰컨트롤러에 직접 상속

2. extention 이용

 

이것들을 사용하기 위해선 viewDidLoad()에 delegate 패턴을 사용한다고 알려줘야 합니다.

사용하는 방법의 요점은 다음과 같습니다.

이후 tableView의 cell을 적절히 조절해 사용합니다.

import UIKit

class ViewController: UIViewController {
    @IBOutlet weak var tableView: UITableView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // dataSource delegate 패턴
        self.tableView.dataSource = self
        // dataSource를 사용할 때 delegate 패턴
        self.tableView.delegate = self
    }    
}

extension ViewController: UITableViewDataSource {
    
    // Row의 개수를 알려주는 함수 (필수)
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return self.tasks.count
    }
    
    // 셀의 내용 정의 (필수)
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        // 재사용 가능한 테이블뷰 셀 반환
        // withIdentifier는 재사용할 셀이다.
        // withIdentifier은 사용할 셀의 고유값(임의 지정) for은 재사용할 indexPath
        let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath )
        
        // cell의 내용을 지정후 반환
        
        return cell
    }
    
    // 편집모드에서 삭제버튼을 눌렀을 때 어떻게 할 것인가를 알려주는 메서드
    // 편집모드는 self.tableView.setEditing(true, animated: true)로 진입 가능하다.
    func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {

    }
    
    // 행이 이동하면 원래 위치(sourceIndexPath)와 어디로(destinationIndexPath) 이동하는지 알려준다.
    func tableView(_ tableView: UITableView, moveRowAt sourceIndexPath: IndexPath, to destinationIndexPath: IndexPath) {
        // 재정렬 될때 처리

    }
    
}

extension ViewController: UITableViewDelegate {
    // 셀이 선택이 되었을 때 어떻게 되는가
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        // 선택된 행만 새로고침
        // at에 배열을 넣어 여러개 새로고침도 가능하다.
        self.tableView.reloadRows(at: [indexPath] , with: .automatic )
    }
}

 

 

2022 02 15 추가

 

cell의 왼쪽과 오른쪽에 swipe 제스쳐 추가

공식 문서를 보고 만들었는데 아직 UIAcontextualAction의 handler 파라미터는 뭔지 잘 모르겠다.

// leading에 버튼 추가하기
    override func tableView(_ tableView: UITableView, leadingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration? {
            
        let action =  UIContextualAction(style: .normal, title: "왼쪽 스와이프") { _, _, _ in
            print("왼쪽 행 클릭!")
        }
        
        return UISwipeActionsConfiguration(actions: [action])
    }
    
    // trailing에 버튼 추가하기
    override func tableView(_ tableView: UITableView, trailingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration? {
        let action =  UIContextualAction(style: .normal, title: "오른쪽 스와이프") { _, _, _ in
            print("오른쪽 행 클릭!")
        }
        
        return UISwipeActionsConfiguration(actions: [action])
    }
반응형