UICollectionView의 cellForItemAtIndexPath가 호출되지 않습니다.


104

UICollectionView를 두 번째로 사용하고 아마도 씹을 수있는 것보다 더 많이 물었을 것입니다.

서브 클래 싱 한 사용자 지정 UICollectionViewCell을 사용하는 UICollectionView (myCollectionView)를 구현하고 있습니다. 서브 클래 싱 된 셀 (FullReceiptCell)은 UITableView를 포함하며 viewcontroller의 크기입니다. FullReceiptCells 사이의 가로 스크롤을 허용하려고합니다.

myCollectionView를 포함하는 서브 클래 싱 된 UICollectionViewController가 nav 컨트롤러 스택으로 푸시됩니다. 현재 myCollectionView loas 및 수평 스크롤이 활성화되어 있습니다. 그러나 셀은 표시되지 않습니다. 나는 확인했다

- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section

실행되어 0보다 큰 정수를 반환합니다. 또한 myCollectionView의 델리게이트와 데이터 소스가 IB에서 하위 클래스 UICollectionViewController로 올바르게 설정되어 있는지 확인했습니다.

셀이로드되는 방법 :

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath

호출되지 않습니다.

다음은 해당 컨트롤러 내에서 UICollectionViewController 및 내 viewDidLoad 메서드를 푸시하는 위치입니다 (참고 : initWithBill은 일반 이니셜 라이저의 재정의입니다).

이전 ViewControllers .m 파일에서 :

FullReceiptViewController *test = [[FullReceiptViewController alloc] initWithBill:currentBill];
test.title = @"Review";
[self.navigationController pushViewController:test animated:YES];

FullReceiptViewController.m에서 :

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.
    [self.myCollectionView registerClass:[FullReceiptCell class] forCellWithReuseIdentifier:@"FullReceiptCellIdentifier"];
    self.myCollectionView.pagingEnabled = YES;
    // Setup flowlayout

    self.myCollectionViewFlowLayout = [[UICollectionViewFlowLayout alloc] init];
    [self.myCollectionViewFlowLayout setItemSize:CGSizeMake(320, 548)];
    [self.myCollectionViewFlowLayout setSectionInset:UIEdgeInsetsMake(0, 0, 0, 0)];
    [self.myCollectionViewFlowLayout setScrollDirection:UICollectionViewScrollDirectionHorizontal];
    self.myCollectionViewFlowLayout.minimumLineSpacing = 0;
    self.myCollectionViewFlowLayout.minimumInteritemSpacing = 0;
    [self.myCollectionView setCollectionViewLayout:myCollectionViewFlowLayout];
    //testing to see if the collection view is loading
    self.myCollectionView.backgroundColor = [UIColor colorWithWhite:0.25f alpha:1.0f];

왜 호출되지 않는지에 대한 단서가 있습니까?


XIB를 사용하고 있습니다. 나는 결코 호출되지 않기 때문에 cellForItemsAtIndexPath에서 어떤 것도 대기열에서 뺄 수 없습니다.
IkegawaTaro 2013

답변:


135

나중에 여기에서 우연히 발견 한 사람들을 위해 .... 이유 :

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath

collectionViewFlowLayout의 높이가 너무 커서 itemSize가 호출되지 않았습니다.

[self.myCollectionViewFlowLayout setItemSize:CGSizeMake(320, 548)];

높이를 410으로 변경하면 cellForItemAtIndexPath가 실행됩니다.


좀 더 자세히 설명해 주시겠습니까? 저
에게도 똑같은

난 그냥 당신도 collectionViewContentSize에주의 할 필요가 있다는 것을 발견
디미타르 Marinov

49
자동 레이아웃을 사용하는 경우-collectionView에 높이 제한을 설정해야합니다-이것에 많은 시간을 낭비했습니다!
bpn

레코드 높이 구속 나를 위해 일을하지 않았다위한 .. 수평 중심의 제약을 트릭했다
모하메드 에마 Hegab

4
collectionView가 AutoLayout을 사용하여 topLayoutGuide로 제한되고 NavigationBar 아래로 스크롤하지 않아야하는 경우 Adjust Scroll View InsetsStoryboard의 ViewController에서 선택을 취소해야합니다 .
브루노 Galinari

96

제 경우에는 레이아웃 클래스 UICollectionViewLayoutUICollectionViewFlowLayout


1
감사합니다. 저를 괴롭 히십시오.
Rambatino

이것은 내 문제였습니다! 조금 직관에 반해서 나에게도 발생하지 않았습니다. 감사합니다!
WendiKidd

저도 마찬가지입니다! 간과하기가 너무 쉽습니다! 다시 한번 감사
arvidurs

여기 Facepalm, 이것을 지적 해 주셔서 감사합니다 (4 년 전).
Milander

나는 같은 문제에 직면했다. 감사합니다
Piyush Gupta 2018

31

컬렉션 뷰에 콘텐츠 크기 정보를 제공하지 않으면 cellForItemAtIndexPath가 호출되지 않습니다.

  1. 흐름 레이아웃을 사용하는 경우 : 항목 크기를 적절하게 설정해야합니다.
  2. UICollectionViewLayout에서 서브 클래 싱 된 사용자 지정 레이아웃이있는 경우 : collectionViewContentSize 메서드에서 적절한 크기를 반환하는지 확인합니다.

후자의 경우에는 layoutAttributesForElementsRect 도 호출되지 않습니다. 그 이유는 콘텐츠 크기를 지정하지 않았으며 기본적으로 크기는 CGSizeZero입니다. 이것은 기본적으로 컬렉션 뷰에 페인트 할 내용이 없음을 알려주므로 속성이나 셀을 요구하지 않습니다.

따라서 collectionViewContentSize를 재정의하고 적절한 크기를 제공하면 문제가 해결됩니다.


1
예를 들어 사용 가능한 전체 크기를 사용하려면 collectionViewContentSize에서 collectionView.frame.size를 반환합니다 (기본적으로 0, 0으로 설정되는 collectionView.contentSize가 아님)
Adam Loving

감사! 이 답변은 사용자 정의 UICollectionViewLayout이 있습니다. 시뮬레이터에서 앱을 가로 방향으로 시작하면 일부 셀이 초기보기에 나타나지 않았습니다. 콘텐츠 크기를 재정의하면이 문제가 해결되었습니다.
Chris Livdahl 2017

1
감사합니다. 제 경우에는 collectionViewContentSize너비에 대해 0을 잘못 반환했기 cellForItemAtIndexPath때문에이 호출되지 않았습니다.
izerik

16

어쩌면 나는 그것을 간과하고 있지만 귀하의 대리인과 데이터 소스가 누락 된 것 같습니다. 헤더 파일에서 다음을 추가했는지 확인하십시오.

<UICollectionViewDelegate, UICollectionViewDataSource>

viewDidLoad 메소드에서 다음을 추가하십시오.

self.myCollectionView.delegate = self;
self.myCollectionView.dataSource = self;

또한 .xib를 통해로드하는 경우 IBOutlet을 UICollectionView에 연결했는지 확인하십시오.


1
나는 그것을 보여주지 않았지만 이미 헤더 파일에 델리게이트와 데이터 소스가 기록되어 있습니다. 또한 IBOutlet을 myCollectionView에 연결했습니다. 이 collectionview에 대한 델리게이트 및 데이터 소스가 FullReceiptViewController로 설정되었습니다. 이상한 것은 numberOfItemsInSection (데이터 소스 프로토콜 방법)이라고하고 0보다 정수 이상을 돌려지고 있다는 것입니다
IkegawaTaro

음, 응용 프로그램을 시작하면 컬렉션보기가 표시되거나 어떤 작업을 수행합니까? 그것은 numberOfItemsInSection가 0보다 뭔가 이상을 반환하는 경우 그것의 일부 항목이 있는가 같은 소리
안토니 카스텔

후속 조치 해 주셔서 감사합니다. collectionview가 표시됩니다 ... 배경색을 변경했기 때문에 알 수 있습니다. 문제를 발견했다고 생각합니다. [self.myCollectionViewFlowLayout setItemSize : CGSizeMake (320, 548)]; 너무 컸어 요. 높이를 410으로 줄이면 cellForItemAtIndexPath 메서드를 호출 할 수 있습니다.
IkegawaTaro 2013

@AnthonyCastelli 안녕하세요, 저는 또한 동일한 문제에 직면하고 있습니다. numberOfItemsInSection이 pop에서 viewController로 호출되지만 cellForItemsAtIndexPath가 아닙니다. 그래서 당신은 단서를 얻습니까?
Bhavin Kansagara 2013

16

보다 복잡한보기 계층 구조를 보려면이 블로그 를 확인하십시오 . 그것은 내 생명을 구했습니다!

self.automaticallyAdjustsScrollViewInsets = NO;

1
나는 이것에 너무 많은 시간을 보냈다. 그리고 모든 것이 그것으로 귀결되었다. 스토리 보드 또는 XIB를 사용하는 경우 부모보기 컨트롤러를보고 기본적으로 켜져있는 속성 검사기에서 "스크롤보기 삽입 조정"을 선택 취소합니다. 나는 다른 모든 대답을 시도했지만 작동하지 않았습니다.
etayluz 2011 년

15

클래스가 UICollectionviewController의 하위 클래스이고 프로그래밍 방식으로 collectionView를 생성하는 경우

let layout = UICollectionViewFlowLayout()
    layout.scrollDirection = .Vertical
    layout.itemSize = CGSizeMake(50, 50)

    collectionView?.setCollectionViewLayout(layout, animated: false)

이것이 내 문제를 해결 한 답입니다! 재정의 메서드 func collectionView (_ collectionView : UICollectionView, 레이아웃 collectionViewLayout : UICollectionViewLayout, sizeForItemAt indexPath : IndexPath)-> CGSize {<# code #>}가 작동하지 않습니다.
Mike

8

나는 자동 레이아웃을 사용하고 있었고 내 경우에는 높이 제약이 누락되었습니다.


6

내 문제는 동일한 뷰 내에 2 개의 컬렉션 뷰가 있고 둘 다 계산 된 UICollectionViewFlowLayout인스턴스를 공유한다는 것 입니다. 동일한 흐름 레이아웃의 별도 인스턴스를 만든 후에는 제대로 작동했습니다.


5

제 경우에는 UICollectionViewDataSource프로토콜 메서드를 구현하는 것이 어리석게 잊혀진 numberOfItemsInSection것이기 때문에 확인해야 할 또 다른 사항입니다.


4

또한 컬렉션 뷰가 애니메이션 (삽입, 삭제, 업데이트 또는 수행 BatchUpdates)으로 업데이트되는 동안 reloadData가 호출되지 않는지 확인합니다.


4

제 경우에는 세트 collectionView.prefetchingEnabled = NO;가 내 문제를 해결했습니다. iOS 10에서만 작동합니다.


2
나는 얼마 전에 그 대답을 찬성했고 오늘은 다시 나를 도왔습니다 : D 당신은이 대답 남자에 대한 귀족을받을 자격이 있습니다. 다시 한 번 감사드립니다!
Maciek Czarnik

이 대답은 나를 위해 일했습니다! 처음부터 true로 설정하지 않았기 때문에 포함 된 이유에 대한 설명이 있었으면합니다.
Lance Samaria

3

cellForItem 메서드를 수정하여 항목 높이 == 0 일 때 발생했습니다.


3

10 분 전에 나도이 문제를 만났는데 어리석은 실수를 저질렀습니다.

내 의도는 UICollectionViewFlowLayout을 사용하는 것입니다.

하지만 실수로 UICollectionViewLayout을 사용했습니다.


3

제 경우에는 UINavigationBar의 반투명을 NO로 변경하면 문제가 해결되었습니다.


3

Xcode 7.0.1에서는 스토리 보드와 다른 프로젝트의 코드를 복사 할 때이 문제가 발생했습니다. 컬렉션보기에는 스토리 보드에 설정된 사용자 지정 흐름 레이아웃이 있습니다. 해결책은 다음과 같습니다.

  • IB에서 흐름 레이아웃 제거
  • 앱 컴파일 / 실행
  • 흐름 레이아웃을 다시 설정

이제 작동했습니다 :)


2

numberOfSectionsInCollectionView양의 정수도 반환 하는지 확인하십시오 .

컬렉션에 섹션이 하나 이상 있어야합니다.


2

-(NSInteger) collectionView : numberOfItemsInSection :이 양수 (읽기, 0보다 큼) 값을 반환하는지 확인합니다. [self.collectionView reloadData]를 배치하는 문제 일 수 있습니다. 완료 핸들러에서.


2

컬렉션 뷰에서 자동 크기 조정 마스크를 false로 설정하는 것을 잊었습니다.

collectionView.translatesAutoresizingMaskIntoConstraints = false

2

레이아웃 문제가 발생할 수 있습니다. 콘솔에서 레이아웃 경고가 있는지 확인하십시오.


2

제 경우에는 잘못된 자동 레이아웃 제약으로 인해 컬렉션 뷰가 상위 뷰에서 완전히 보이지 않았습니다. 따라서 제약 조건을 수정하면 컬렉션 뷰가 모두 표시되고 cellForItemAtIndexPath가 호출되었습니다.


2

스토리 보드 / xib에서 UICollectionView 속성 cellSize는 {0, 0}이 아니어야합니다.


2

컬렉션 뷰 프로토콜을 사용하는 경우 CollectionViewDataSourceCollectionViewDelegate프로토콜을 ViewController에 연결해야합니다 . 인터페이스 빌더 아웃렛


1

나도 마찬가지였다. 2 개의 UICollectionView가 있었고 필요하지 않았기 때문에 한 번 제거했습니다. 그 후 CellForItemAtIndexPath가 호출되지 않고 다른 필요한 메서드가 있음을 깨달았습니다. 위의 모든 것을 시도했지만 표준 마법을 사용했습니다. 스토리 보드에서 컬렉션 뷰를 제거하고 다시 추가했습니다. 그런 다음 작동하기 시작했습니다. 이유를 모르고 설명이 없지만 연결 문제가있을 수 있습니다.


스토리 보드의 다른 UIViewController에서 내 UICollectionView를 복사했습니다. CollectionView를 삭제하고 작동하도록 다시 추가했습니다. 답변 주셔서 감사합니다.
Drunken Daddy

1

특정 상황에서이 문제를 해결했습니다.

제 경우에는 부모 ViewController에서 UICollectionViewController를 수동으로 초기화 한 다음 UICollectionViewController의보기를 하위보기로 추가했습니다.

부모의 viewDidAppear에서 collectionView에서 'setNeedsLayout'및 / 또는 'setNeedsDisplay'를 호출하여 문제를 해결했습니다.

- (void)viewDidAppear:(BOOL)animated {
   [super viewDidAppear:animated];
   [_collection.view setNeedsLayout];
   [_collection.view setNeedsDisplay];
}

1

사용할 UICollectionViewDelegateFlowLayout때이 함수가 반환하는 내용에주의하십시오. width및 둘 다 height보다 커야 0합니다. window프레임 참조로 사용 했지만 복잡한 뷰 계층 구조 창 때문에 nil런타임에있었습니다. 화면 너비에 따라 요소의 너비를 조정해야하는 경우 UIScreen.main.bounds.

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: 
           UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {}

1

내 경우에는 내가 있었다 collectionViewA의를 UIStackView함께 alignment = .center. 그래서 collectionView너비가 없었습니다. 을 설정하는 경우 stackView.alignment.fill모든 것이 좋았다.


0

나를 위해 autolayout을 통해 self.view (collectionView의 superview)의 높이를 업데이트하고 layoutIfNeeded그 후에 호출해야 합니다.

[self.view mas_updateConstraints:^(MASConstraintMaker *make) {
    make.height.equalTo(@(height));
}];
[self.view layoutIfNeeded];

0

제 경우에는 예상 콘텐츠 크기를 조정해야했습니다. 콘텐츠 크기가하지 않았습니다.

  let layout = collectionVC.collectionView.collectionViewLayout as! UICollectionViewFlowLayout
    layout.itemSize = CGSize(width: 100, height: 100)
    layout.estimatedItemSize = CGSize(width: 100, height: 100)

0

비슷한 문제가 발생했습니다. 그러나 대신 cellForItemAtIndexPath항목 수가> 1 일 때 호출되었지만 단일 항목 만있을 때는 호출되지 않았습니다. 여기에서 제안 된 많은 솔루션을 시도했으며 항목 크기와 관련이 있다는 것을 발견 한 많은 것과 유사합니다. 저에게 해결책은의 예상 크기 UICollectionViewAutomatic 에서 Custom 으로 변경하는 것이 었습니다 .

예상 크기를 사용자 지정으로 설정


-1

이 문제는 스토리 보드에서로드 된 Contained 뷰 컨트롤러의 CollectionView와 함께 작업하는 데 약간의 시간이 걸립니다. 포함 된 뷰 컨트롤러를 삭제하고 스토리 보드에 다시 생성하는 작업을 마치고이 문제가 해결되는 것 같습니다. 제 생각에는 어떤 종류의 스토리 보드 손상이 발생한 것 같습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.