UICollectionView内部的UIColViewView

时间:2014-09-23 15:47:06

标签: ios objective-c iphone uitableview uicollectionviewcell

我注意到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。或者,我是否使用了糟糕的方法?有没有办法做到这一点?

我对此很困惑......

谢谢你们!

1 个答案:

答案 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;在其他方面代表,很奇怪。但它有效!!

谢谢,伙计们!