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가지가 있다.
- performBatchUpdates() 사용
- 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가 있다고 하니 이 부분과 위의 부분들을 가지고 노는 걸 한번 해봐야겠다.
'iOS' 카테고리의 다른 글
[iOS] MPNowPlayingInfoCenter/MPRemoteCommandCenter 를 통해 백그라운드 미디어 재생 관리 (0) | 2021.03.23 |
---|---|
[iOS] Background Audio AVPlayer (0) | 2021.03.22 |
[iOS] Animation - 1 (0) | 2021.03.17 |
[iOS] Navigation BackButton 조작 + NavigationItem vs NavigationBar (0) | 2021.03.11 |
[iOS] UITableView's Header/FooterView is following scroll(테이블 뷰 헤더/푸터가 스크롤을 따라와서 플로팅 될 때) (0) | 2021.03.04 |