collectionView:cellForItemAtIndexPath: 永远不会被调用 [英] collectionView:cellForItemAtIndexPath: never gets called
问题描述
我有一个 UICollectionView,我只是想让它显示出来.我将委托和数据源附加到界面构建器中的文件所有者.
I have a UICollectionView and I simply want it to show up. I have the delegate and datasource attached to the file's owner in the interface builder.
collectionView:numberOfItemsInSection:
被调用就好了.
我已经搞了几个小时了,只是想不通......
I have been messing with this for a few hours and just can't figure it out...
任何帮助都会很棒,提前致谢!
Any help would be great, Thanks in advance!
这里是完整的源代码.抱歉,有点乱.
Here is the full source. Sorry if its kinda messy.
.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
推荐答案
我遇到了类似的问题.cellForItemAtIndexPath
没有被调用.在拔出几分钟的头发后,我从 viewDidLoad
方法中删除了 collectionView
registerClass:forCellWithReuseIdentifier
.
I was having a similar problem. cellForItemAtIndexPath
was not being called. After pulling out my hair for several minutes, I removed the collectionView
registerClass:forCellWithReuseIdentifier
from the viewDidLoad
method.
这样做之后,cellForItemAtIndexPath
开始被调用.
After doing that, cellForItemAtIndexPath
began to get called.
我希望这会有所帮助.
这篇关于collectionView:cellForItemAtIndexPath: 永远不会被调用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!