cell 재사용에 대한 버그

1643 단어
며칠 전에 동료의 코드를 바꾸었다
코드의 일부를 요약합니다.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:cellString];
    
    cell.textLabel.text = _leftTitles[indexPath.row];
    cell.textLabel.font = fontSize_15;
    cell.selectionStyle = UITableViewCellSelectionStyleNone;
    
    StayConfirm *model = self.datas[0];
    if (model && 0 == indexPath.row) {
       //    
    }else if (1 == indexPath.row) {
      //    
    }else if (2 == indexPath.row) {
        //    
    }else if (3 == indexPath.row) {
       //    
    }else if (4 == indexPath.row) {
       //    
    }
    return cell;
}
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    if (3 == indexPath.row) {
        if (_adressIsHide == YES) {
            return 80.0f;
        }else {
            return 78.0f;
        }
    }else if (4 == indexPath.row) {
        return 80.0f;
    }
    return 44.0f;
}

그럼 문제가 생겼어요. 이 코드는 빨리 불러오기를 원했어요. 그래서 무슨 게으름을 피우고 UI 레이아웃, 논리 처리를 모두cellForRow에 썼는데...안쪽
어쩐지, 아이고, 짜임새가 좋네. 다시 보니까 머리가 너무 아파.
이렇게 쓰면 첫 번째 개발은 시간을 조금 줄일 수 있지만 후기에는 유지하기가 쉽지 않다.
그건 그렇고,
그러나 치명적인 문제는 이 코드 안의 셀은 기본적으로 하나하나가 다르지만 셀의 ID는 똑같다는 것이다. 테이블뷰를 드래그해서 셀을 리셋할 때 셀의 ID가 똑같기 때문에 셀을 리셋할 때 무작위이다. 만약에 낡은 셀의 대상이 다 풀리지 않으면 새 셀은 낡은 셀의 물건으로 리셋되어 구조의 혼란을 초래할 수 있다.
해결책
그렇다면 셀마다 다른 ID를 주어 다른 차이가 큰 셀을 다시 사용하지 않도록 하세요. 하지만 차라리 전체 뷰를 직접 쓰는 게 낫습니다.add에서 scrollView로 이동하는 것이 편리합니다.
ps:cell이 같은지 여부는 컨트롤의 종류와 수량의 차이에 달려 있습니다

좋은 웹페이지 즐겨찾기