nscollectionViewItem의보기에서 represe-를 얻는 방법은 무엇입니까?
-
13-09-2019 - |
문제
내 CollectionView의 각 항목에 사용되는 견해가 있습니다. 내 견해에서 CollectionViewItem에 대한 iboutlet을 가지고 있으며 인터페이스 빌더에 연결되어 있습니다. 내보기 코드에서 exprentedObject (핵심 데이터 객체)의 값에 액세스하고 싶습니다. 다음은 내가하려는 일의 예입니다.
.h 파일에서 :
IBOutlet NSCollectionViewItem *item; // Connected in IB
.m 파일에서
NSString *seq = [[item representedObject] valueForKey:@"seq"];
NSLog(@"Seq: %@", seq); // returns Seq: (null)
seq는 exprentedObject.se key path를 사용하여 IB의 CollectionViewItem보기에서 레이블에 묶여 있기 때문에 인구가됨을 알고 있습니다.
뷰의 코드에서 SEQ 값에 액세스하려고 할 때 NULL을 반환하는 이유는 무엇입니까?
해결책
NSCOLLECTIONVIEWITEM은 ICBOUTLET 연결을 통해 항목의 뷰에서 프로토 타입 NSCOLLECTIONVIEWITEM으로 복사하지 않을 가능성이 높습니다. 따라서, item
그렇습니다 seq
또한 nil이 될 것입니다.
nscollectionViewItem 인스턴스에 액세스하기위한 일반적인 패턴은 프로토 타입에 바인딩하는 것입니다. 당신은 당신이 이것을했고 그것이 작동한다고 언급합니다. 그것은 단순히 그것이 전형적이고 지원되는 방법이기 때문입니다.
바인딩이 제공 할 수없는 방식으로 항목에 직접 연결 해야하는 경우 수동으로 설정해야 할 것입니다. 이를 수행하는 한 가지 방법은 NSCOLLECTIONVIEWITEM을 무시하는 것입니다 -copyWithZone:
, Super를 호출 한 다음 수동으로 연결하십시오.
다른 팁
1) 하위 클래스 컬렉션보기에서 항목을 렌더링하는 데 사용되는 NSView
2)이 서브 클래스에서 대의원을 추가하십시오.
3) nscollectionViewItem을 subsass
4) setView : Method를 무시하십시오. 뷰의 대의원 속성을 nscollectionViewItem 인스턴스 (즉, 자체)로 설정하려면 줄을 추가하십시오.
이제 NSView 서브 클래스 내에서 대의원 속성을 통해 해당 NSCOLLECTIONVIEW 항목에 액세스 할 수 있습니다 (예 : exprentedObject에 액세스 할 수 있음).
나는 같은 문제가 있었지만 매우 쉬운 해결책을 찾았습니다.보기를 다른 .xib에 넣고 nscollectionviewitem (실제로 nsviewcontroller)에 연결했습니다. 그러면 .xib는 각 셀에 대해 사형화되고 모든 매장이 설정됩니다.
- 서브 클래스 nsview.
- 상기 서브 클래스에 대표 방법을 추가하십시오 ...
- (void)mouseDownOnItemAtIndex:(NSUInteger)index
청취자에게 사용자가 특정 색인에서 항목을 클릭했음을 알리기 위해. - 동일한 클래스에서 self.superview를 사용하여 컬렉션보기를 당깁니다. nsuinteger를 저장할 변수를 만듭니다. 메소드를 사용하여 항목의 색인 저장
[[collectionView subviews] indexOfObject:self]
. 대의원 방법으로 해당 지수를 전달하십시오index
매개 변수. - NSVIEW에 정의 된 프로토콜을 준수하는 클래스는 이제 특정 셀의 모든 마우스 타운 이벤트에서들을 수 있습니다. 특정 항목의 대표를 원한다면
collectionView:itemAtIndex
그리고 항목을 통해 액세스하여 항목을 얻으십시오representedObject
재산NSCollectionViewItem
.