collectionView:cellForItemAtIndexPath: 永远不会被调用

Posted

技术标签:

【中文标题】collectionView:cellForItemAtIndexPath: 永远不会被调用【英文标题】:collectionView:cellForItemAtIndexPath: never gets called 【发布时间】:2012-10-24 07:52:24 【问题描述】:

我有一个 UICollectionView,我只是想让它显示出来。我在界面生成器中将委托和数据源附加到文件的所有者。

collectionView:numberOfItemsInSection:

被调用就好了。

我已经搞砸了几个小时,只是想不通......

任何帮助都会很棒,在此先感谢!

这里是完整的来源。抱歉,如果有点乱。

.h 文件

#import <UIKit/UIKit.h>
#import <MapKit/MapKit.h>
#import "PinAnnotation.h"

#import "Jot.h"

@interface JotCardViewController : UIViewController <MKMapViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout>

@property (nonatomic,strong) Jot* jot;

@end

.m 文件

#import "JotCardViewController.h"

#import "JotViewController.h"

#import <QuartzCore/QuartzCore.h>

@interface JotCardViewController ()

@property (nonatomic,strong) JotViewController *detailViewController;
@property (nonatomic,strong) IBOutlet UIView *cardFrontView;
@property (nonatomic,assign,getter = isFlipped) BOOL flipped;
@property (nonatomic,weak) IBOutlet MKMapView *mapView;
@property (nonatomic,strong) IBOutlet UICollectionView *collectionView;

@property (nonatomic,weak) IBOutlet UILabel *jotTitle;
@property (nonatomic,weak) IBOutlet UILabel *jotDate;
@property (nonatomic,weak) IBOutlet UILabel *sunriseSunsetDelta;
@property (nonatomic,weak) IBOutlet UILabel *jotNotes;

@end

@implementation JotCardViewController

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil

    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) 
        // Custom initialization
    
    return self;


- (void)viewDidLoad

    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.
    [[self mapView] setRegion:MKCoordinateRegionMakeWithDistance(CLLocationCoordinate2DMake([self.jot.latitude floatValue], [self.jot.longitude floatValue]), 1000, 1000)];
    //TODO: if there is no jot location - say that their isn't (maybe text over the map display)
    CLLocation *tempLocation = [[CLLocation alloc] initWithCoordinate:CLLocationCoordinate2DMake([self.jot.latitude doubleValue], [self.jot.longitude doubleValue]) altitude:0 horizontalAccuracy:0 verticalAccuracy:0 timestamp:nil];
    [self dropPin:tempLocation];


    [self.collectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:@"Cell"];


    [self.collectionView reloadData];


- (void) viewWillAppear:(BOOL)animated

    [self refreshUIFromJot];


- (void)didReceiveMemoryWarning

    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.


- (IBAction)flipToDetails:(id)sender

    if (![self isFlipped]) 
        if (!self.detailViewController) 
            JotViewController *jotViewController = [[JotViewController alloc] initWithNibName:@"JotView" bundle:[NSBundle mainBundle]];
            jotViewController.jot = self.jot;
            self.detailViewController = jotViewController;
            self.detailViewController.view.frame = self.cardFrontView.frame;
            self.detailViewController.view.layer.cornerRadius = 10.0;
        

        [UIView transitionFromView:self.cardFrontView toView:self.detailViewController.view duration:0.33 options:UIViewAnimationOptionCurveLinear |UIViewAnimationOptionTransitionFlipFromRight completion:^(BOOL finished) 
            [self setFlipped:YES];
        ];
     else 
        [UIView transitionFromView:self.detailViewController.view toView:self.cardFrontView duration:0.33 options:UIViewAnimationOptionCurveLinear |UIViewAnimationOptionTransitionFlipFromLeft completion:^(BOOL finished) 
            [self setFlipped:NO];
        ];
    


- (void) setJot:(Jot *) jot 
    _jot = jot;
    [self refreshUIFromJot];


- (void) refreshUIFromJot

    [[self jotTitle] setText:self.jot.summary];
    [[self jotDate] setText:self.jot.recorddate];
    [[self jotNotes] setText:self.jot.note];
    [[self sunriseSunsetDelta] setText:@""];


-(void) dropPin: (CLLocation*)newLocation

    for (id<MKAnnotation> pin in self.mapView.annotations)
        MKAnnotationView* anView = [self.mapView viewForAnnotation: pin];
        if (anView)
            [self.mapView removeAnnotation:pin];
            NSLog(@"Pin removed");
        
    

    PinAnnotation *pin = [[PinAnnotation alloc] initWithCoordinates:newLocation.coordinate placeName:nil description:nil];
    [self.mapView addAnnotation:pin];




#pragma  mark - MKMapViewDelegate methods

- (void) mapViewDidFinishLoadingMap:(MKMapView *)mapView

    NSLog(@"Map!");


#pragma mark - UICollectionView DataSource

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

    return 1;


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

    UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"Cell" forIndexPath:indexPath];
    //cell.backgroundColor = [UIColor colorWithPatternImage:[self.results objectAtIndex:indexPath.row]];
    return cell;

    //###
    /*
    NSSet *jotImages = self.jot.images;
    NSSortDescriptor *imageNameDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"imageName" ascending:YES];
    NSArray *sortedJotImages = [jotImages sortedArrayUsingDescriptors:@[imageNameDescriptor]];
    */
    //###



#pragma mark - UICollectionViewDelegate
- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath

    // TODO: Select Item

- (void)collectionView:(UICollectionView *)collectionView didDeselectItemAtIndexPath:(NSIndexPath *)indexPath 
    // TODO: Deselect item


#pragma mark – UICollectionViewDelegateFlowLayout

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath

    CGSize retval = CGSizeMake(100, 100);
    return retval;


- (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout insetForSectionAtIndex:(NSInteger)section

    return UIEdgeInsetsMake(50, 20, 50, 20);


@end

【问题讨论】:

【参考方案1】:

我遇到了类似的问题。 cellForItemAtIndexPath 未被调用。拔头发几分钟后,我从viewDidLoad 方法中删除了collectionView registerClass:forCellWithReuseIdentifier

之后,cellForItemAtIndexPath 开始被调用。

我希望这会有所帮助。

【讨论】:

【参考方案2】:

我遇到了类似的问题,这是我的解决方案:

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

没有被调用是因为collectionViewFlowLayout的itemSize的高度太大。

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

如果我将高度改为 410,它将执行 cellForItemAtIndexPath。

【讨论】:

【参考方案3】:

我发现我有一个错误的设置自定义流布局类导致我出现问题。恢复为 Flow 布局,效果很好。

【讨论】:

以上是关于collectionView:cellForItemAtIndexPath: 永远不会被调用的主要内容,如果未能解决你的问题,请参考以下文章