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

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];

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



답변

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

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

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

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

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


답변

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


답변

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

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

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

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


답변

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

<UICollectionViewDelegate, UICollectionViewDataSource>

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

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

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


답변

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

self.automaticallyAdjustsScrollViewInsets = NO;


답변

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

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

    collectionView?.setCollectionViewLayout(layout, animated: false)


답변

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