我注意到iOS在UICollectionView
内使用UITableViewCell
时非常有意思。我想要实现的目标是在UICollectionView
内拥有一组图像(UITableViewCell
方法)。我试图模仿Facebook的帖子风格,我认为,他们有一个UITableView
,有自定义单元格等等,但这里问题... < / p>
我设法将UICollectionView
置于UITableViewCell
内,并且它正常且完美,没问题,一切正常,可点击等等。但是,我尝试重构我的代码,提取 UICollectionViewDataSource
&amp;将 UICollectionViewDelegate
分隔成单独的文件,以便重新使用它们并在Main View Controller
上使用较少的代码,就在这里,当我的梦魇开始时,我不会&#39 ; t知道为什么如果我使用单独的文件iOS循环Cell的配置。例如:
-(void)configureCell:(UICollectionViewCell*)customCell atIndexPath:(NSIndexPath*)indexPath;
上述方法在过程的两个部分被调用:
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
NSString *identifier = [self retrieveIdentifierForIndexPath:indexPath];
UITableViewCell *myCell = [tableView dequeueReusableCellWithIdentifier:identifier];
[self configureCell:myCell atIndexPath:indexPath];
[cell setNeedsLayout];
[cell layoutIfNeeded];
[cell setNeedsUpdateConstraints];
[cell updateConstraintsIfNeeded];
CGFloat height = [cell.contentView systemLayoutSizeFittingSize:UILayoutFittingExpandedSize].height;
return height;
}
上面使用AutoLayout计算行高的方法我在 StackOverFlow 的帖子上读到了这个(不记得帖子:()
在计算高度等之后,另一种方法会调用&#34; configureCell
&#34;方法:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
NSString *rowName = [self retrieveIdentifierForIndexPath:indexPath];
PostDetailTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:rowName forIndexPath:indexPath];
//PreCondition
if([rowName isEqualToString:@"LoadingRow"]){
return cell;
}
// Configure the cell...
[self configureCell:cell atIndexPath:indexPath withImages:YES];
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
return cell;
}
当调试器启动时,方法 configureCell:atIndexPath:
被一遍又一遍地调用。这是第二次发生这种情况。这是否意味着我不能分开&#34; DataSource
?或 这是不可能的 在UICollectionView
内添加UITableViewCell
。或者,我是否使用了糟糕的方法?有没有办法做到这一点?
我对此很困惑......
谢谢你们!
答案 0 :(得分:2)
我很长时间都在努力,花了好几个小时重新设计了布局等等。 我终于得到了解决方案:
这是我单元格的头文件
@interface MyCustomTableViewCell : UITableViewCell
@property (strong, nonatomic) IBOutlet UILabel *someLabel;
@property (strong, nonatomic) IBOutlet UICollectionView *collectionView;
-(void)setImages:(NSArray*)images;
@end
这就是魔术超越所有这些实施文件(m)
@interface MyCustomTableViewCell() <UICollectionViewDataSource, UICollectionViewDelegate>
@property (strong, nonatomic) NSArray *imageArray;
@end
@implementation MyCustomTableViewCell
-(void)setImages:(NSArray*)images{
_imageArray = images;
[_collectionView setDataSource:self];
[_collectionView setDelegate:self];
[_collectionView reloadData];
}
#pragma mark - UICollectionViewDataSource Methods
...
...
...
#pragma mark - UICollectionViewDelegate Methods
...
...
...
@end
使用Above方法使CollectionView显示并显示其内容。我还想向CollectionView添加一个动作,例如,当单击一个图像时显示 MWPhotoBrowser ,我在单元格的Header文件中添加了一个方法:
-(void)setViewController:(UIViewController*)viewController;
在实施文件上安装它,并在代理方法上调用 MWPhotoBrowser 。我知道它真的很奇怪,因为它迫使我使用Cell来显示DataSource&amp;代表。当我应该能够回收我的DataSource&amp;在其他方面代表,很奇怪。但它有效!!
谢谢,伙计们!