2012-11-08 3 views
4

UICollectionViewCell을 갖고 싶습니다. 을 인스턴스화하고 UICollectionView에 추가합니다. 이 작업을 수행하려면 UICollectionViewCell 인스턴스의 .reuseIdentifier 속성을 설정해야합니다.UICollectionViewCell에서 .reuseIdentifier를 설정하십시오.

일반적으로 세포가 컬렉션 뷰에 등록하고, 콜렉션 뷰는 이러한 방법으로, .reuseIdentifier 이미 설정된와 셀의 인스턴스를 설명하는 클래스 또는 펜촉 : 나는 때문에,

- registerClass:forCellWithReuseIdentifier: 
- registerNib:forCellWithReuseIdentifier: 

그러나 콜렉션 뷰 외부에서이 셀을 구성하면 이러한 셀이 적용되지 않습니다.

셀을 직접 만들면 .reuseIdentifier을 설정할 방법이 없습니다 (읽기 전용 속성이고 초기화하는 방법이 init...이기 때문에).

.reuseIdentifier이 설정되지 않은 경우 셀을 추가하면 UICollectionView이 예외를 throw합니다. 이 동작은 재사용 식별자가 선택적 인 UITableView과 다릅니다.

수집 뷰 셀의 재사용 식별자를 설정하기 쉬운 해결책은 그때 위를 통과 할 수

[NSBundle.mainBundle loadNibNamed:@"MyCellName" owner:self options:nil][0]; 

갖는 셀의 인스턴스를 생성하는 .xib 파일을 포함하고 Identifier 박스를 사용하는 -instantiated UICollectionViewCell 그리고 모든 것이 잘 동작합니다.

...하지만 그것은 매우 바보 같고 임의의 농구대를 뛰어 넘는 것처럼 보입니다. .xib - 래퍼 우회를 거치지 않고 셀 인스턴스에이 속성을 설정하는 다른 방법이 있습니까?


업데이트 : 컬렉션 뷰는 항상 디큐 뷰가 아니라 코드에서 명시 적으로 만들어야합니다

코드의 생성 프로세스를 단순화하기 위해 애플의 설명서는이 말한다. 그것을 필요로하지 않기 때문에이 (즉, 외부 인스턴스화 세포가 잘 같은 긴 .xib에서로드 된 경우 자신의 식별자가 예를 들어, 어떻게 든를 설정되어 작동), 사실은 사실이 아니다

..., 또한 특정 사용 사례에서 "내 코드의 작성 프로세스를 단순화하지"않습니다 (오히려 별도의 파일이 필요하고 콜렉션 뷰가 이러한 몇 가지 복잡한 일회용을 생성하도록 요구하는 것이 더 까다 롭습니다).

위의 내용은 질문에 대한 대답이 '아니오'라는 것을 의미하는 것으로 보입니다. 컬렉션보기에서 대기열에서 큐를 제외하는 것 외에는 사용 가능한 셀을 만드는 것이 의도적으로 어렵습니다.

+1

볼 수 있습니다 아마도 도움이 될 것입니다. http://stackoverflow.com/ 질문/12729612/custom-uitableview-with-reuseidentifier-without-style/12730053 # 12730053. (그것은 테이블 뷰 셀을위한 것이지만 콜렉션 뷰 셀에서도 마찬가지라고 생각합니다.) –

+0

감사합니다. 시도하는 것이 좋은 트릭입니다. 나는 또한'setValue : forKey'가'readonly' 비트 주위에서 작동하는지 궁금합니다. :) – mjh

답변

2

다음 두 가지 방법을 사용하십시오.

– registerNib:forCellWithReuseIdentifier: 
– dequeueReusableCellWithReuseIdentifier:forIndexPath: 

참조 사과의 UICollectionView Class Reference

+0

위의 방법은 광고로 작동하지만 이것은 내 질문에 대답하지 않습니다. 내가 여기서하고있는 것은 콜렉션 뷰에 임의의 일회용 셀을 몇 개 전달하여 다른 곳에서 생성되는 것입니다. 또한, 내가 묻는 것은 * .xib 사용을 피하는 방법이다. – mjh

+0

UICollectionViewCell 사용 코드를 생성하고 다른 위치에서 사용하고 싶습니까? – sunkehappy

+0

맞습니다.'UICollectionViewCell' 서브 클래스에서 일종의'init' 메소드를 호출하고 해당 특정 인스턴스를 콜렉션 뷰에 표시하려고합니다. – mjh

1

내가 말을 미안하지만 난 당신이 UICollectionView이 UICollectionViewCells를 생산하는 유일한 애플 브랜드의 공장이라는 사실을 받아 들여야 할 것 같아요.따라서 정확히 동일한 오브젝트을 표시하려는 두 개의 콜렉션 뷰가있는 경우, 행운입니다!

좋은 소식은 과 완전히 똑같이 보이는 셀을 표시하려는 두 개의 컬렉션보기가있는 경우 작업을 완료 할 수 있다는 것입니다. 그것은 쉽게 : 클래스는 UICollectionView의 CV1 및 CV2을 소유 중의 한편

@interface MyModelClass : NSObject 
    // a bunch of data 
@end 


@interface MyCollectionViewCell : UICollectionViewCell 
-(void)refreshCellWithObject:(MyModelClass *)object; 
@end 

,

[[self cv1] registerClass:[MyCollectionViewCell class] forCellWithReuseIdentifier:@"MyCollectionViewCell"]; 

[[self cv2] registerClass:[MyCollectionViewCell class] forCellWithReuseIdentifier:@"MyCollectionViewCell"]; 

그리고 데이터 소스가 같은

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { 
    MyModelObject *obj = [self theObjectIWant]; 

    MyCollectionViewCell *cell; 

    cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"MyCollectionViewCell" forIndexPath:indexPath]; 

    [cell refreshCellWithObject:obj]; 

    return cell; 
} 
+0

"UICollectionView가 UICollectionViewCell을 제작할 수있는 유일한 Apple 브랜드 공장이라는 사실을 받아 들여야 할 것 같습니다." 그러나 UICollectionView없이 xib를 사용하여 UICollectionViewCell을 만들 수 있습니다. – user102008

+0

당신 말이 맞을지도 모르지만, 올해 초 나는 오랜 실험 끝에 애플의 권장 연습을하기로 결정했습니다. http://stackoverflow.com/q/15939234/1224741에 나와있는 다소 관련 Q & A를 참조하십시오. Apple 엔지니어가 다소 관련있는 견적을 가지고 있습니다. – QED

+0

refreshCellWithObject : 메소드의 구현을 제공 할 수 있습니까? reuseidentifier로 Cell을 새로 고칠 수있는 방법. –

관련 문제