프로그래밍/IOS (Swift)

[Swift] UITableView 스크롤시 값이 중복되는 현상

훙리 2021. 4. 19. 15:50

 

 

 

Swift 개발을 하면서 tableView 를 만드는 상황은 아마 매번 있지 않을까 싶습니다.

 

아직 초보자인 저로써는 UITableView를 만들면서 크나큰 난관에 봉착하였는데...

 

그건 바로 테이블 뷰의 크기를 미리 정해놓고 그 안에 값을 하나하나 추가하는 기능을 구현하는 과정에서 있었습니다.

 

제가 원한거는 10개의 테이블 row에서 현재 배열에 들어있는 값 하나만을 출력하고 싶었으나 .

 

안보이는 부분의 스크롤을 내리는 순간 그 밑에도 한개가 추가되고 계속 오르락 내리락 하면서 맨 윗칸 혹은 아랫칸에 정보가 씌여진다는 것 입니다. 

 

 

 

 

이와 같이 row index 가 0 일때만 text 값을 입력해 주었는데 안보이는 tableview가 보이면서 데이터가 reload 되기 때문입니다 .

 

제가 이렇게 작성을 하면 위와 같이 출력이 됩니다. 

 

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        // 해당 섹션에 몇개의 row가 있어야 하는지 반환
        let cell : UITableViewCell = tableView.dequeueReusableCell(withIdentifier: self.cellIdentifier, for: indexPath)
  
  		//appDelegate.codeList는 AppDelegate에 있는 넣을 Value의 배열
        if appDelegate.codeList.count == 0 {
            return cell
            
        }
      
        if indexPath.section == 0 {
            if indexPath.row < appDelegate.codeList.count {
                cell.textLabel?.text = appDelegate.codeList[indexPath.row]
                cell.textLabel?.textAlignment = .center
                cell.textLabel?.textColor = .black
            }
            
        }
        return cell
    }
    

 

저도 처음에는 이부분이 문제일거라고는 생각하지 못했습니다.

 

 

검색해보니 CellForRowAt이 스크롤로 화면이 바뀔때마다 Reload되는데 거기서 보여지는 화면의 최상단의 값이 바뀌고 있으니 전체 TableView에서 균열이 발생하는 것 이었습니다.

 

예를 들어서 아스날FC가 "더 보기"리그 1위를 달리고 있다. 뭐 이런 느낌일까요...? 

데닐손 : ....???

 

 

 

해결 방법은 바로 지속적인 초기화 입니다.

 

 

아래와 같이 "" 빈 String으로 CellForRowAt이 불리울때마다 해당되지 않는 값에 "" 라는 빈 값을 넣어주면 깨끗하게 원하는 TableView가 완성 됩니다. 

 

 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        // 해당 섹션에 몇개의 row가 있어야 하는지 반환
        let cell : UITableViewCell = tableView.dequeueReusableCell(withIdentifier: self.cellIdentifier, for: indexPath)
        var cellText : String = ""
        if appDelegate.codeList.count == 0 {
            
            return cell
            
        }
      
        if indexPath.section == 0 {
            if indexPath.row < appDelegate.codeList.count {
                cellText = appDelegate.codeList[indexPath.row]
                cell.textLabel?.textAlignment = .center
                cell.textLabel?.textColor = .black
            }
            
        }
        
        cell.textLabel?.text = cellText
        
        return cell
    }