iOS/코드조각

[iOS, Swift] TableView에 모든 셀 가져오기

검은참깨두유vm 2023. 3. 10. 00:00
반응형

iOS 16.1, Xcode 14.2, Swift 5, UIKit 환경에서 진행했습니다.

 

 

TableView에서 모든 셀을 가져오는 가장 간단한 방법은 TableView의 visibleCells 속성을 사용하는 것입니다. 이 속성은 현재 TableView에 표시되는 모든 셀의 배열을 반환합니다.

let cells: [UITableViewCell] = tableView.visibleCells

 

위와 같이 cell을 가져올 수는 있지만, 보통 UITableViewCell을 상속받는 셀을 사용합니다.

그래서 CustomTableViewCell 타입으로 받으려면 형변환을 해주어야합니다.

아래와 같이 compactMap 함수를 사용하여 커스텀 타입으로 형변환할 수 있습니다.

let customCells = tableView.visibleCells.compactMap { $0 as? CustomTableViewCell }

이렇게 하면 TableView에서 가져온 모든 셀 중에서 CustomTableViewCell 타입으로 형변환이 가능한 셀만 포함된 배열이 반환됩니다.

 

하지만, visibleCells 속성은 현재 화면에 보이는 셀만 가져옵니다. 만약 TableView가 스크롤 가능한 경우, 스크롤을 내린 경우에는 보이지 않는 셀은 가져오지 못합니다.

보이지 않는 셀까지 가져오기 위해서는 TableView의  indexPathsForVisibleRows 속성을 사용하여 현재 화면에 보이는 셀의 indexPath를 가져온 후,  indexPathsForVisibleRows 속성에 포함되지 않은 셀들도 가져와야합니다.

 

var allCells: [CustomTableViewCell] = []

// 화면에 보이는 셀 가져오기
if let visibleIndexPaths = tableView.indexPathsForVisibleRows {
    let visibleCells = visibleIndexPaths.compactMap { tableView.cellForRow(at: $0) as? CustomTableViewCell }
    allCells += visibleCells
}

// 화면에 보이지 않는 셀 가져오기
if let allIndexPaths = tableView.indexPathsForRows(in: tableView.bounds) {
    let allCells = allIndexPaths.compactMap { tableView.cellForRow(at: $0) as? CustomTableViewCell }
    allCells += allCells
}

 

indexPathsForVisibleRows 속성으로 가져온 셀과 indexPathsForRows(in:)속성으로 가져온 셀을 합쳐서 모든 셀을 가져올 수 있습니다.

반응형