본문 바로가기

Swift 공부

TableView Reusable

AppStore Clone App을 만들던중 버전에서 더보기 기능을 만드는데

TableView에서 더보기를 클릭하고 아래로 내려갔다 돌아오면 초기화가 되어있거나 의도치 않은부분이 더보기가 눌러져있거나

하는 문제가 발견되어 뭐가 문제인지 곰곰히 생각을 해보니 Cell 의 재사용 관련된 문제였다

 

버전 페이지

 

 

 

 

 

위의 사진을 보면 무슨말이냐 TableView를 그릴때 Cell을 아래로내려갈때마다 새로그리는게 아니라 기존에 있던 Cell을 재사용 한다 라고 이해하면될것같다 

그래서 내가 특정 Cell에만 Background 0번째 Cell에 만 주더라도 0번째 Cell 에서만 background 색상이 바껴있는것이 아닌 다른 cell에서도 색상이 바뀌는 현상을 발견하게 된다. 

 

 

 

제가 개발했을때는 TableView 의 Cell 에 UILabel에 더보기가 달린 Cell을 만들었는데

아래에서 영상에서 본거처럼 제가 더보기를 눌러 TextLabel을 확장시킨다면 재사용된 Cell에서도 똑같이 더보기가 눌러져 있는

현상을 발견할수있다. 

ex)TableViewCell에서 imageView에 이전 Cell의 이미지가 들어가있는 경우가 있다.

 

그럼 이 문제를 해결하기 위해 어떻게해야하나 

 

override func prepareForReuse() {
        super.prepareForReuse()
        relaseLabel.numberOfLines = 3
        moreButton.isHidden = false
        delegate = nil
}

 

 

prepareForReuse 메소드는 Cell이 재사용 되기전 호출되는 메소드로 이곳에서 Cell의 값들을 초기화시켜주면 
재사용됬을때 내가 설정한 초기값을 기준으로 Cell 이 재사용이 된다.

그래서 Cell에 해당 메소드를 추가해서 진행하게되면

 

이번에는 아래에는 정상적으로 동작하는데 기존에 눌렀던 Cell의 값이 초기화가 되는 오류가... 생기는...

당연한것이 위의 Cell도 돌아오게되면 결국에는 재사용되는 Cell이니 prepareForReuse() 에서 초기화가 되기에

위로돌아오면 다시 더보기 버튼이 보이게되는데 

그래서 내가 선택한 방법은 클릭했을때 클릭한 Cell을 딕셔너리 구조로 저장을 해두고

 

  var leadMoreCount: [Int:Bool] = [:]

 

해당 Cell에서 더보기를 클릭하면 저장할수있게

Cell 클릭에서 해당 이벤트를 추가한다.

 

 

leadMoreCount.updateValue(true, forKey: row)

 

그리고 아이템을 셋팅할때 

 

이렇게 추가해주면?

let cell = tableView.dequeueReusableCell(withIdentifier: VersionTableViewCell.id, for: IndexPath(row: indexPath.row, section: 0)) as! VersionTableViewCell
            if(self.leadMoreCount[indexPath.row] == nil){
                cell.itemSetting(item: item)
            }else{
                cell.relaseLabel.numberOfLines = 0
                cell.moreButton.isHidden = true
                cell.itemSetting(item: item)
            }

 

제가원했던대로 

짜자잔~~~ 이제 더보기를 눌러도 초기화되지 않고  아래의 Cell 은 정상적으로 줄어들어있는

제가 원했던 기능의 TableView가 완성이 되었습니다. 

이렇게 푸는게 좋은방식인지는 모르겠습니다. 하지만 지금 공부를 하고있을때 떠오르는 가장 최선의 방법이였고 TableView 자체의 옵션값으로 설정할 수 있는 방법이 생긴다면 다시 공유드리도록하겠습니다..

 

해당 코드는 앱스토어 클론 코딩으로 만들었고 VersionListView 페이지에서 사용되고있습니다.

설명이 부실하거나 다른 코드에서 궁금증이 생기신다면 언제든지 댓글이나 쪽지 주세요! 제가 아는 지식이라면 언제든지 공유드리겠습니다

 

https://github.com/gnejfejf2/AppStoreCloneApp

 

GitHub - gnejfejf2/AppStoreCloneApp

Contribute to gnejfejf2/AppStoreCloneApp development by creating an account on GitHub.

github.com

 

'Swift 공부' 카테고리의 다른 글

Static Dispatch vs Dynamic Dispatch  (0) 2022.03.30
Tuist , 모듈화 공부 기록기  (0) 2022.03.26
GCD - (1)  (0) 2022.03.14
MVVM RxSwift , Combine  (0) 2022.03.12
Swift MVVM  (0) 2022.03.09