2017-12-31 5 views
0

collectionView를 사용하여 캘린더를 만드는 연습을하고 있습니다.collectionView 셀이 reloadData() 후에 무작위로 강조 표시됩니다.

내 구현은 간단합니다. 지금은 주로 https://github.com/Akhilendra/calenderAppiOS/tree/master/myCalender2입니다. 간단한 캘린더 만 이미지합니다. enter image description here

사용자가 원하는 날짜를 선택하고 셀을 선택한 후 약간의 경계선을 만들도록하여 몇 가지 발전을 이루려고합니다.

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: reuseIdentifier, for: indexPath) as! CustomCell 
    cell.backgroundColor=UIColor.clear 
    if indexPath.item <= firstWeekDayOfMonth - 2 { 
     print(firstWeekDayOfMonth) 
     cell.isHidden=true 
    } else { 

     let calcDate = indexPath.row-firstWeekDayOfMonth+2 
     cell.isHidden=false 
     cell.dateLabel.text="\(calcDate)" 
     if calcDate < todaysDate && currentYear == presentYear && currentMonthIndex == presentMonthIndex { 
      cell.isUserInteractionEnabled=true 
      cell.dateLabel.textColor = UIColor.darkGray 
     } else { 
      cell.isUserInteractionEnabled=true 
      cell.dateLabel.textColor = UIColor.black 
     } 
    } 
    return cell 
} 

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { 
    addToList.append(indexPath) 
    //dayCollectionView.deselectItem(at: indexPath, animated: true) 
    let cell = collectionView.cellForItem(at: indexPath) 
    cell?.layer.borderWidth = 2.0 
    cell?.layer.borderColor = UIColor.gray.cgColor 
} 

지금 재사용 기능 때문에 선택한 셀이 내 collectionView 주위로 점프됩니다. 이 문제를 해결하는 방법은 reloadData를 사용하지 않는 것이 좋지만, 다음 달로 전달할 때 collectionView 전체를 플러시해야합니다.

누군가 나를 도와 줄 수 있습니까? 사용자가 다음 달로 이동하고 선택한 셀을 사용자가 선택한 시점에 유지하면 선택한 셀을 지우고 싶습니다.

미리 감사드립니다.

+0

선택한 셀에 대해 부울 검사를 유지할 수 있습니다. –

+0

@ user3431800 : 아래의 답변을보십시오 –

답변

1

문제 : 셀 CollectionView하고있는 TableView에 재활용하기 때문에

세포가 무작위로 collectionView으로 표시됩니다 이유입니다. 사용자가 셀을 선택하면 테두리 너비와 테두리 색을 변경하여 셀을 강조 표시하지만 사용자가 스크롤하면 같은 셀이 다른 indexPath에 대해 재사용됩니다. 셀 재사용시 적용된 효과가 제거되지 않으므로 셀이 틀린 위치에 강조 표시됩니다.

해결 방법 : 자신의 사용자 지정 셀 클래스를 가지고 있기 때문에

, 당신은 항상 셀을 재활용 할 때 셀에 적용되는 효과를 취소 prepareForReuse를 사용할 수 있습니다.

그래서 CustomCell 클래스를 열고

override func prepareForReuse() { 
    super.prepareForReuse() 
    self.layer.borderWidth = 1.0 //whatever the default border width is 
    self.layer.borderColor = UIColor.clear.cgColor //whatever the cell's default color is 
} 

를 추가하지만 지금은 원치 않는 세포의하지만 다시 선택한 셀에 사용자가 스크롤도 선택한 셀이 어떤을 강조하지 않을 때는 강조 표시되지 않습니다 절반 문제를 해결 더 길게. 그게 우리가 자리에 prepareForReuse을 가지고 있기 때문에 그래서 cellForRowAtIndexPath 다른 조건을 위의 코드에서

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: reuseIdentifier, for: indexPath) as! CustomCell 
    cell.backgroundColor=UIColor.clear 
    if indexPath.item <= firstWeekDayOfMonth - 2 { 
     print(firstWeekDayOfMonth) 
     cell.isHidden=true 
    } else { 
     let calcDate = indexPath.row-firstWeekDayOfMonth+2 
     cell.isHidden=false 
     cell.dateLabel.text="\(calcDate)" 
     if calcDate < todaysDate && currentYear == presentYear && currentMonthIndex == presentMonthIndex { 
      cell.isUserInteractionEnabled=true 
      cell.dateLabel.textColor = UIColor.darkGray 
     } else { 
      cell.isUserInteractionEnabled=true 
      cell.dateLabel.textColor = UIColor.black 
     } 

     //check if cell needs to be highlighted 
     //else condition isnt required because we have prepareForReuse in place 
     if addToList.contains(indexPath) { 
      cell?.layer.borderWidth = 2.0 
      cell?.layer.borderColor = UIColor.gray.cgColor 
     } 
    } 
    return cell 
} 

로가 필요하지 않은 수정 cellForRowAtIndexPath

으로 강조 할 필요가있는 경우 조건부 셀을 강조 할 필요가 발생하는 셀에 추가 된 모든 하이라이트를 제거하는 작업을 수행합니다.

희망 하시겠습니까?

+0

나를 도와 주셔서 고맙습니다! 실제로 누군가가 prepareForReuse를 사용하고있는 것을 보았습니다.하지만 객체 -c에 있습니다. 솔루션은 reloadData 후에 셀의 이전 상태가 무엇이든 경계를 지우거나 지 웁니다. 그러나 다음 부분에서 어떤 셀이 선택되었는지 기억하기 위해 솔루션은 어느 월인지에 상관없이 해당 위치의 셀을 강조 표시합니다. 세포는 다른 달로 구별 할 필요가 있습니다.내 생각은 인덱스 경로 배열 배열을 포함하는 2 차원 배열 (크기 12)의 고정 된 크기를 만드는 것입니다. 그걸하는 법을 친절히 가르쳐 주시겠습니까? 나는 또한 사전을 시도했지만 여기에 갇혀있다. – user3431800

+0

@ user3431800 : addToList 배열에 indexPath를 저장하는 것을 보았다. 다시 강조 표시하기 위해 사용할 수 있다고 생각 했으므로 잘못된 셀이 강조 표시되도록해야한다. 방법은 셀을 고유하게 식별하는 방법, 그래서 당신은 날짜를 저장하는 대신 인덱스 경로를 저장하는 것이 아니라 나중에 cellForRowAtIndexPath에서 다음 인덱스를 비교하는 경우 날짜를 비교할 수 있다면 당신의 문제를 해결할 수있는 비교할 수 있다고 생각했다. 나는 그 논리로 나의 대답을 업데이트 하겠지만, 당신의 데이트 계산 논리는 내가 이해하지 못하는 것이라고 생각했습니다! –

+0

@ user3431800 : 마음에 들지 않으면 선택되지 않은 다른 셀에서 선택한 날짜와 구별되는 고유 한 점이 무엇인지 알 수 있습니다. 사용자의 캘린더 로직에 특정한 내용이 있어야합니다. –

관련 문제