Getting a CollectionView delegate to load properly

时间:2015-07-28 16:00:20

标签: delegates xcode6 uicollectionview viewcontroller

(Let me first put the error up here so that I don't forget it: could not dequeue a view of kind: UICollectionElementKindCell with identifier Cell - must register a nib or a class for the identifier or connect a prototype cell in a storyboard)

I've got a regular UICollectionViewController that loads just fine. But I also have another controller (UserViewController) that loads a CollectionView delegate (UserPlaceViewController).

I get really confused with what I have to load in the delegate and what I have to load in the current controller. But anyway here's the delegate as-is:

#import "UserPlaceViewController.h"

@interface UserPlaceViewController ()

@end

@implementation UserPlaceViewController
@synthesize placeArray, placeTable;

- (void)viewDidLoad
{
    [super viewDidLoad];
//    placeTable.delegate = self;

    UICollectionViewFlowLayout* flowLayout = [[UICollectionViewFlowLayout alloc]init];
    flowLayout.itemSize = CGSizeMake(145, 150);
    [flowLayout setScrollDirection:UICollectionViewScrollDirectionVertical];
    placeTable = [[UICollectionView alloc] initWithFrame:self.view.bounds collectionViewLayout:flowLayout];
    //self.collectionView.frame = CGRectMake(10, 120, self.view.bounds.size.width-20, self.view.bounds.size.height-50);
    placeTable.autoresizesSubviews = YES;
    placeTable.autoresizingMask = (UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight);
    //placeTable.separatorStyle = UITableViewCellSeparatorStyleSingleLine;
    placeTable.scrollEnabled = YES;

    self.view = placeTable;
    NSLog(@"%lu", (unsigned long)[placeArray count]);
}

That's basically the whole thing. Couple other things at the end... but that's it for the most part.

And here are the relevent parts of the ViewController:

- (void)viewDidLoad
{
    [super viewDidLoad];
    [self.navigationController setNavigationBarHidden:YES animated:YES];
    UserPlaceViewController *collectionView = [[UserPlaceViewController alloc] initWithNibName:@"UserPlace" bundle:nil];
    UINib * placeCell = [UINib nibWithNibName:@"Shops" bundle:nil];
    [collectionView.placeTable registerNib:placeCell forCellWithReuseIdentifier:cellIdentifier];

- (void) fetchedData: (NSData *) responseData
{
UserPlaceViewController * uptvLike = [[UserPlaceViewController alloc] init];
    if (IS_IPHONE5) {
        uptvLike.view.frame = CGRectMake(0, 0, 320, 300);
    }
    else
    {
    uptvLike.view.frame = CGRectMake(0, 0, 320, 200);
    }
    uptvLike.placeTable.delegate = self;
    uptvLike.placeTable.dataSource = self;
    uptvLike.placeTable.layer.borderWidth = 1.0f;
    uptvLike.placeTable.layer.borderColor = [UIColor colorWithRed:5/255.0f green:96/255.0f blue:255/255.0f alpha:1.0f].CGColor;
    [uptvLike.placeTable reloadData];
    [self.scrollView addSubview:uptvLike.view];
}

And finally:

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

    PlaceCell * cell = [collectionView dequeueReusableCellWithReuseIdentifier:cellIdentifier forIndexPath:indexPath];


    Place * p = [placeArray objectAtIndex:indexPath.item];
    cell.placeName.text = p.PName;
    cell.placeImg.image = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:p.PImage]]];
    return cell;
}

Like I said: I know how a UICollectionView is supposed to work. I've got one running. I know you have to register a nib or class in viewDidLoad (I've registered a Nib.) But I'm confused over how exactly to load this delegate and where to load what. For example I see that I'm initialising the collectionview in both the delegate and the view controller. I'm also confused about WHERE exactly I should load the nib... (delegates give me a headache...)

So what the hell... It's raining. I figured I'd ask.

1 个答案:

答案 0 :(得分:0)

确定。你想要一个UICollectionView,但你也想要有很多常规的" View"同一屏幕上的项目?有两件事很重要:

1。您不需要两个ViewControllers。您只需要将通常作为常规ViewController的UICollectionViewController加载:

@interface UserViewController : UIViewController <UICollectionViewDataSource, UIScrollViewDelegate>

2。完成后,您可以在该视图的顶部加载您的收藏视图:

UICollectionViewFlowLayout* flowLayout = [[UICollectionViewFlowLayout alloc]init];
    flowLayout.itemSize = CGSizeMake(145, 150);
    [flowLayout setScrollDirection:UICollectionViewScrollDirectionVertical];
    self.collectionView = [[UICollectionView alloc] initWithFrame:self.view.frame collectionViewLayout:flowLayout];
 [self.scrollView addSubview:self.collectionView];
    [self.view addSubview:HUD];

    UINib * placeCell = [UINib nibWithNibName:@"UserCell" bundle:nil];

    [self.collectionView registerNib:placeCell forCellWithReuseIdentifier:@"Cell"];

其余的只是您标准的CollectionView内容。