我有2个UICollectionView' s。
一个用于网格样式显示,另一个用于单个文件显示。这是由UISegmentedControl控制的。
网格样式集合视图是在界面构建器中创建的:
另一个集合视图是在我的默认网格样式集合视图控制器的自定义类的viewDidLoad方法中以编程方式创建的。
- (void)viewDidLoad
{
[super viewDidLoad];
UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init];
[layout setItemSize:CGSizeMake(140, 272)];
[layout setMinimumLineSpacing:1];
[layout setMinimumInteritemSpacing:1];
[layout setSectionInset:UIEdgeInsetsMake(0, 0, 0, 0)];
[layout setScrollDirection:UICollectionViewScrollDirectionVertical];
_collectionView2 = [[UICollectionView alloc] initWithFrame:self.view.frame collectionViewLayout:layout];
[_collectionView2 setDelegate:self];
[_collectionView2 setDataSource:self];
[_collectionView2 registerClass:[VAGGarmentCell class] forCellWithReuseIdentifier:@"Cell2"];
[_collectionView2 setBackgroundColor:[UIColor redColor]];
[self.view addSubview:_collectionView2];
[_collectionView2 setHidden:YES];
}
我在这两个集合视图中使用相同的自定义单元格。
以下是两个集合视图使用的dataSource和委托方法。
1
-(NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section
{
if ([collectionView isEqual:_collectionView]) {
NSArray *people = [_thisController objects];
return [people count];
} else if ([collectionView isEqual:_collectionView2]) {
NSArray *people = [_thisController objects];
return [people count];
}
return 0;
}
2
-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath object:(PFObject *)object
{
if ([collectionView isEqual:_collectionView2]) {
NSLog(@"collectionview 2 loaded");
static NSString *CellIdentifier = @"Cell2";
VAGGarmentCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:CellIdentifier forIndexPath:indexPath];
cell.backgroundColor = [UIColor whiteColor];
PFFile *userImageFile = [object valueForKey:@"image"];
[[cell imageView] setFile: userImageFile];
[[cell imageView] loadInBackground];
[[cell title] setText:[object valueForKey:@"title"]];
[[cell price] setText:[NSString stringWithFormat: @"£%@ GBP", [object valueForKey:@"price"]]];
return cell;
} else if ([collectionView isEqual:_collectionView]) {
NSLog(@"collectionview 1 loaded");
static NSString *CellIdentifier = @"Cell";
VAGGarmentCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier: CellIdentifier forIndexPath:indexPath];
[[cell activityIndicator] startAnimating];
PFFile *userImageFile = [object valueForKey:@"image"];
[[cell imageView] setFile: userImageFile];
[[cell imageView] loadInBackground];
[[cell activityIndicator] stopAnimating];
[[cell title] setText:[object valueForKey:@"title"]];
[[cell price] setText:[NSString stringWithFormat: @"£%@ GBP", [object valueForKey:@"price"]]];
return cell;
}
return 0;
}
点击分段控件时会触发此方法:
- (void)displayTypeSegmentSelected
{
_selectedDisplayTypeIndex = [_displayTypeControl selectedSegmentIndex];
if (_selectedDisplayTypeIndex == 0) {
NSLog(@"Single file item view selected");
[_collectionView setHidden:YES];
[_collectionView2 setHidden:NO];
[_collectionView2 reloadData];
} else {
NSLog(@"Grid style view selected");
[_collectionView setHidden:NO];
[_collectionView2 setHidden:YES];
[_collectionView reloadData];
}
}
我觉得一切都做得很好。当我点击分段控件的网格样式侧时,我的主集合视图会显示出来。
当我点击单个文件段控制选项时,结果如下:
正如您所见,单元格显示但是空白。我不太确定发生了什么。如果我点击网格样式段选项,则主集合视图显示正常。
但是,虽然单个文件集合视图显示正确的单元格数量,但不会显示任何内容。它下面应该有一个图像和一些文字。
我无法帮助,但我认为我错过了一步。在我的第二个自定义视图中,我是否已经在IB中自动执行了一些步骤?
请注意,我还没有更改单元格大小,以使集合视图2单文件样式。我想先移动内容,然后再继续前进。
感谢帮助
此致
更新
#import "VAGGarmentCell.h"
@implementation VAGGarmentCell
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
// Initialization code
}
return self;
}
衣服单元和.h:
#import <UIKit/UIKit.h>
#import <Parse/Parse.h>
@interface VAGGarmentCell : UICollectionViewCell
@property (weak, nonatomic) IBOutlet PFImageView *imageView;
@property (weak, nonatomic) IBOutlet UIButton *addFavouriteButton;
@property (weak, nonatomic) IBOutlet UITextView *title;
@property (weak, nonatomic) IBOutlet UILabel *price;
@property (weak, nonatomic) IBOutlet UIActivityIndicatorView *activityIndicator;
答案 0 :(得分:1)
我认为问题是尝试使用在storyboard集合视图中定义的_collectionView2中的单元格。而不是这样做,从storyboard集合视图中删除单元格,并在xib文件中创建单元格。将该单元格的类更改为VAGGarmentCell,并将任何IBOutlet连接到VAGGarmentCell类。在viewDidLoad中,为两个控制器注册nib(不是类)。
[_collectionView2 registerNib:[UINib nibWithNibName:@"VAGGarmentCell" bundle:nil] forCellWithReuseIdentifier:@"Cell2"];
[self.collectionView registerNib:[UINib nibWithNibName:@"VAGGarmentCell" bundle:nil] forCellWithReuseIdentifier:@"Cell"];
您可以使用相同的重用标识符或不同的重用标识符,只要您注册的标识符与您在各自控制器的celForItemAtIndexPath中使用的标识符相同,就无关紧要。