2017-02-20 8 views
1

임 NSCollectionView 및 NSCollectionViewItems로 작업 중입니다.NSCollectionViewItem이 reloadData 뒤 엉켜 있습니다.

다음과 같은 문제가 발생했습니다 : 항목 중 하나의 NSImageView를 회전 한 다음 reloadData를 호출하면 업데이트 된보기가 엉망이됩니다. 회전은 다음 항목으로 넘어 가고 각도는 달라집니다.

이미지 아래 코드 :

enter image description here

enter image description here

enter image description here

enter image description here

회전 코드 :

,

모델 :

class LibraryViewItem: NSCollectionViewItem { 

// 1 
var model: ImageModel? { 
    didSet { 
     guard isViewLoaded else { 
      print("asd") 
      return } 
     if let imageFile = model { 
      imageView?.image = imageFile.thumbnail 
      textField?.stringValue = imageFile.fileName 
     } else { 
      imageView?.image = nil 
      textField?.stringValue = "" 
     } 
    } 
} 

// 2 
override func viewDidLoad() { 
    super.viewDidLoad() 
    view.wantsLayer = true 
    view.layer?.backgroundColor = NSColor.white.cgColor 
    // 1 
    view.layer?.borderWidth = 0.0 
    // 2 
    view.layer?.borderColor = NSColor.lightGray.cgColor 


} 

func setHighlight(_ selected: Bool) { 
    view.layer?.borderWidth = selected ? 5.0 : 0.0 
} 

}

위임 metod 다음 NSCollectioViewItem의이 항목 인스턴스를 피함으로써 성능을 향상시키기 위해 재사용

 func collectionView(_ collectionView: NSCollectionView, itemForRepresentedObjectAt indexPath: IndexPath) -> NSCollectionViewItem { 

    let item = collectionView.makeItem(withIdentifier: "LibraryViewItem", for: indexPath) 
    guard let collectionViewItem = item as? LibraryViewItem else {return item} 

    let libraryModel = itemsToShow[indexPath.item] 
    collectionViewItem.model = libraryModel 
    if let selectedIndexPath = collectionView.selectionIndexPaths.first, selectedIndexPath == indexPath { 
     collectionViewItem.setHighlight(true) 
    } else { 
     collectionViewItem.setHighlight(false) 
    } 

    return item 
} 

답변

1

.

NSCollectioViewItem에는 항목을 다시 사용하기 전에 호출되는 prepareForReuse()이라는 메서드가 있습니다.

문제를 해결하려면 prepareForReuse()을 무시하고 맞춤 구현에서 이미지 회전을 0 도로 설정 (다시 설정)하십시오.

또한 회전 코드 뒤에 collectionViewItem.reloadData()을 호출하지 마십시오.

+1

감사합니다. 이것이 정확하게 문제를 해결 한 것입니다! – PolosatiyVjih