Old_SWIFT(221012)/기본이야기

TableView 알아보기(UITableViewDatasource, UITableViewDelegate)

KataRN 2022. 2. 2. 21:33
반응형

안녕하세요. KataRN입니다.

 

오늘은 tableView에 대해 알아보겠습니다.

tableView가 참 많은 기능이 있는데 쓰는것만 쓰는것 같아서요.

해당 글은 패스트캠퍼스 강의를 참고하여 만들었습니다.(내돈내산, 광고아님, 추천은함)

 

우선 뭐가있는지 알아보죠.

UITableView에는 2가지 객체가 있습니다.

 

1. UITableView DataSource

테이블 뷰를 생성하고 수정하는데 필요한 정보를 테이블 뷰 객체에 제공합니다.

 

2. UITableView Delegate

테이블 뷰의 시각적인 부분을 설정하고, 행의 액션 관리, 엑세서리 뷰 지원 그리고 테이블 뷰의 개별 행 편집을 도와줍니다.

 

기본적으로 tableView는 아래 2가지 함수가 필수입니다.

func tableView(UITableView, numberOfRowsInSection: Int)
func tableView(UITableView, cellForRowAt: IndexPath)

셀의 개수와 셀의 정보를 정의합니다.

 

그리고 추가적으로 필요한 함수를 사용하는 방식이죠.

func tableView(UITableView, didSelectRowAt: IndexPath)

 이 함수는 자주 사용해보셨을겁니다. 셀을 선택하면 어떤 행동을 할지 정하는 함수입니다.

보통 여기까지는 기본적으로 사용합니다.

 

아래는 구체적으로 예제와 같이 알아볼 내용입니다.

편집모드 들어가기/나가기, 순서바꾸기, 삭제하기

//편집모드 들어가기/나가기
self.tableView.setEditing(true, animated: true)
self.tableView.setEditing(false, animated: true)

//순서바꾸기(true)
func tableView(_ tableView: UITableView, canMoveRowAt indexPath: IndexPath) -> Bool {
  return true
}

//순서바꾸기(삭제후 넣기)
func tableView(_ tableView: UITableView, moveRowAt sourceIndexPath: IndexPath, to destinationIndexPath: IndexPath) {
  var arrs = self.arrs
  let arr = arrs[sourceIndexPath.row]
  arrs.remove(at: sourceIndexPath.row)
  arrs.insert(arr, at: destinationIndexPath.row)
  self.arrs = arrs
}

//삭제하기(편집모드에 들어갔을때 스와이프삭제, 버튼삭제 둘다 가능)
func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
    self.tasks.remove(at: indexPath.row)
    tableView.deleteRows(at: [indexPath], with: .automatic)
  }

 

 

 

 

 

 

 

- 기능 소개 추가

      cell.accessoryType = .checkmark 를 이용하면 체크 이미지를 추가할 수 있습니다.

 

저희가 테이블뷰를 자주 사용하는데 알면 유용할것같은 기능들만 짧게 적어봤습니다.

편집모드 들어가기, 나오기, 삭제하기, 스와이프삭제하기 정도는 알아두면 유용합니다.

도움이 되길 바랍니다.

전체 코드는 아래 첨부하겠습니다.

오늘도 긴글 읽어주셔서 감사합니다.

 

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var tableView: UITableView!
    @IBOutlet var editButton: UIBarButtonItem!
    var doneButton: UIBarButtonItem?
    
    override func viewDidLoad() {
        super.viewDidLoad()
        tableView.delegate = self
        tableView.dataSource = self
        self.doneButton = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(doneButtonTap))
    }
    
    var arrs = ["1번", "2번", "3번"]
        
    @IBAction func tapEditButton(_ sender: UIBarButtonItem) {
        self.navigationItem.leftBarButtonItem = self.doneButton
        self.tableView.setEditing(true, animated: true)
    }
    
    @objc func doneButtonTap() {
        self.navigationItem.leftBarButtonItem = self.editButton
      self.tableView.setEditing(false, animated: true)
        
    }
}

extension ViewController: UITableViewDataSource, UITableViewDelegate {
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        arrs.count
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
        let arr = self.arrs[indexPath.row]
        cell.textLabel?.text = arr
        return cell
    }
    
    func tableView(_ tableView: UITableView, canMoveRowAt indexPath: IndexPath) -> Bool {
      return true
    }
    
    func tableView(_ tableView: UITableView, moveRowAt sourceIndexPath: IndexPath, to destinationIndexPath: IndexPath) {
      var arrs = self.arrs
      let arr = arrs[sourceIndexPath.row]
      arrs.remove(at: sourceIndexPath.row)
      arrs.insert(arr, at: destinationIndexPath.row)
      self.arrs = arrs
    }
    
    func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
      self.arrs.remove(at: indexPath.row)
      tableView.deleteRows(at: [indexPath], with: .automatic)

      if self.arrs.isEmpty {
        self.doneButtonTap()
      }
    }
}
반응형