2016-08-24 9 views
2

여기 좀 잃어버린 : 나는 colorPicker처럼 행동 버튼을 만들었습니다 : 그것을 클릭하면 popover에있는 collectionView를 보여줍니다. 먼저 view + collectionView (scrollView + clipView로 임베드 됨)가 포함 된 펜촉으로 작업을 수행했습니다. 물건은 잘 작동합니다.NSCollectionViewItem 결코 인스턴스화하지 않습니다

nib 파일이 매우 간단하므로 (프로그래밍 방식으로 뷰를 설계 할 때 코딩 기술을 향상시키기 위해) nib 파일을 제거하고 코드에서 빠진 부분을 작성하기로 결정했습니다. 사실 나는 collectionView의 내용을 제외하고 작업을 완료 할 수 있습니다.

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

데이터 소스를 관리하도록되어, 방법

collectionView.makeItem(withIdentifier: String, for: IndexPath) 

이 작동하지 않습니다 깊은 조사 후에는 방법 안에 나타납니다. 사실,에 : 나는 개입 할 때 디버거가 말한대로

let item = collectionView.makeItem(withIdentifier: ColorPickerPopover.itemIdentifier, for: indexPath) 

항목, 초기화되지 않은 것입니다 (전무하지, 초기화되지 않은). 분명히, makeItem 메소드는 내가 만든 서브 클래스에서 결코 collectionViewItem을 인스턴스화하지 않습니다. 두 개의 프로젝트가이 지점에서 동일하기 때문에 식별자는 괜찮으며 nib 버전과 마찬가지로 collectionView.register 함수가 호출됩니다. makeItem 함수는 단순히 서브 클래 싱 한 NSCollectionViewItem의 loadView 메소드를 호출하지 않습니다.

단서가 있습니까? 클래스

사용 register(_:forItemWithIdentifier:)를 사용

합니다 (:

조쉬

collectionView.makeItem(withIdentifier:for:) 방법으로

답변

1

먼저 두 클래스 또는 컬렉션보기 nib 파일을 등록해야합니다 첫 번째 매개 변수는 AnyClass?을 수용)

collectionView.register(MyCustomCollectionViewItemSubclass.self, forItemWithIdentifier: "SomeId") 

Nib 파일 사용

register(_:forItemWithIdentifier:) (첫 번째 매개 변수는 NSNib?을 사용)을 사용하십시오.

let nib = NSNib(nibNamed: "MyCollectionViewItem", bundle: nil)! 
collectionView.register(nib, forItemWithIdentifier: "SomeId") 

중요한 것은 : 당신의 펜촉 파일에, 당신은 또한 당신이 NSCollectionViewItem 장면에 추가했는지 확인을 에 있습니다. 또한 객체의 클래스를 하위 클래스로 설정해야 작동합니다 (관리자의 패널에서 설정할 수 있음).

희망이 도움이됩니다.