UITableView

UIScrollView를 상속받은 class이며, 세로 스크롤만 지원하고 주로 동일한 형태의 Cell을 사용하는 List를 구현할 때 사용

여러 열(Column)이나 각각의 셀에서 다양한 모양과 크기 등을 사용하고 싶을 때는 CollectionView를 사용한다.

 

선택(Select)

앱을 개발하며 주로 Cell을 눌렀을 때 동작시키는 UITableViewDelegate의 tableView(_:didSelectRowAt:)을 사용했다.

 

Cell 선택이 가능하면 그만큼 Cell을 선택한 후에 할 수 있는 동작이 여러개

혹은, Multiple Selection이 가능하다는 생각이 든다.

 

물론 자주 사용하지는 않겠지만, 이번에 사용해봤기 때문에 정리를 해봐야겠다.

 

Selection

기본적으로 IB에서는 쉽게 적용할 수 있다

가장 아래에 Selection이 있다.

No Selection / Single Selection / Multiple Selection 지정이 가능하다.

 

물론, 코드로도 지정할 수 있다.

tableView.allowsSelection = 
tableView.allowsMultipleSelection = 

두개의 프로퍼티를 true/false로 지정할 수 있다.

 

전체 선택

//단일 Section이라 가정
for row in 0..<tableView.numberOfRows(inSection: 0) {
	tableView.selectRow(at: IndexPath(row: row, section: 0), animated: true, scrollPosition: .none)
}

tableView에 전체 선택 API가 있을 줄 알았는데, 없더라... 일일이 select하고싶은 indexPath를 갖고 선택해준다.

 

전체 해제

// 변수명 그대로 indexPathsForSelectedRows -> 선택된 Row들의 indexPath들
/// 이런게 바로 클린 코드인가... 변수명만 봐도 무슨 역할인지 알겠네...
tableView.indexPathsForSelectedRows?.forEach({ indexPath in
	tableView.deselectRow(at: indexPath, animated: true)
})

 

삽입

맨 상단에 새로운 Cell을 삽입해보자.

코드는 정말 간단하다.

//데이터 추가 및 작업
tableView.insertRows(at: [IndexPath(row: 0, section: 0)], with: .automatic)

 

 

삭제

//데이터 삭제 및 작업
tableView.deleteRows(at: [IndexPath(row: 0, section: 0)], with: .automatic)

 

이동

마지막에 있는 Cell을 가장 위로 올려보겠다.

 

tableView.moveRow(at: IndexPath(row: count-1, section: 0), to: IndexPath(row: 0, section: 0))

 

 

 

동시에 여러 애니메이팅(삽입 삭제 이동) 작업

방법은 2가지가 있다.

  1. performBatchUpdates() 사용
  2. performBatchUpdates() 미 사용

ㅋㅋㅋ... 진짜임...

 

최 하단 2개의 Cell을 최상단으로 올릴 것이다!!

 

우선 사용했을 때 어떻게 되는 지 보자.

 

사용시

 

미 사용시

 

똑같이 보일 수도 있는데... 다르다

숫자 4를 보자... 위치가 다르다..! 왜 다른 걸까..?

코드를 보자

 

@IBAction func movesUsingBatch(_ sender: Any) {
    tableView.performBatchUpdates {
	    tableView.moveRow(at: IndexPath(row: count-1, section: 0), to: IndexPath(row: 0, section: 0))
		tableView.moveRow(at: IndexPath(row: count-2, section: 0), to: IndexPath(row: 1, section: 0))
	} completion: { _ in
		print("")
	}
}
@IBAction func moves(_ sender: Any) {
	tableView.moveRow(at: IndexPath(row: count-1, section: 0), to: IndexPath(row: 0, section: 0))
	tableView.moveRow(at: IndexPath(row: count-1, section: 0), to: IndexPath(row: 0, section: 0))
}

위에는 count-1 -> 0 , count-2 -> 1 로 이동했다.

아래는 똑같이 count-1 -> 0으로 이동 시키는 것을 2번 진행했다.

 

즉, 위는 4를 맨 위로, 3을 두번째로 이동시키도록 했고

아래는 4를 맨위로 올린 후에, 3을 또 위로 올렸다.

 

그렇다면 뭘 언제 쓰라고??

-> 쓰고 싶은 것을 쓰면된다!! 뭐든 할 수는 있으니깐

하지만 만약 performBatchUpdates를 사용하지 않으면, 각각 애니메이팅이 일어날 때마다 tableView의 내부 값(indexPath나 Cell)등이 변경된다.

따라서 한번에 여러개의 애니메이션을 동작시키고 싶다면 Batch 방식을 사용하는 것이 나아 보인다.

 


또한 데이터를 추가/삭제 하고 난 뒤, 항상 tableView.reloadData() 하기 보다는 작업과 연관이 되는 Cell들만 Reload하는 것이 좋은 것이 분명하다!

tableView.reloadRows API가 있다고 하니 이 부분과 위의 부분들을 가지고 노는 걸 한번 해봐야겠다.

 

 

+ Recent posts