每个tableview行

时间:2017-05-26 02:07:55

标签: objective-c iphone xcode7

我是目标c的新手。我想创建一个像Android应用商店的布局设计。这意味着,我有一个tableview,每一行tableview都有一个collectionview,还有一件事,我正在使用xcode7,我想用storyboard创建一个设计。当我应该创建一种类型的设计时,每个tableview行显示collectionview,但我的问题是每个collectionview都有保存数据。但我希望每一行都有不同的数据。我去了许多教程,但我无法理解。任何人都可以帮助我,如何创建这种类型的设计?现在我在viewcontroller.m文件中创建tableview数据和委托方法,并使用集合视图的数据和委托方法到自定义tableview cells.m类。请任何人协助我

1 个答案:

答案 0 :(得分:0)

  

每个collectionview都有保存数据。但我希望每一行都有不同的数据

因为tableViewCell中的集合视图的数据和委托方法是相同的。可能在tableViewCell中确定dataSource和委托实现是不行的,你可以将它委托给你的ViewController和每个tableViewCell&# 39; s有不同的实现。

我已经尝试实现一个演示,它可以工作,但我认为可能有更好的方法。这是我的代码

Cell.h

//Cell.h
#import <UIKit/UIKit.h>

@class MTTableViewCell;
@protocol MTTableViewCellDelegate <NSObject>

- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section     InTableViewCell:(MTTableViewCell *)cell;
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(    NSIndexPath *)indexPath InTableViewCell:(MTTableViewCell *)cell;

@end

@interface MTTableViewCell : UITableViewCell<UICollectionViewDelegateFlowLayout,UICollectionViewDataSource>

@property (nonatomic, weak) id<MTTableViewCellDelegate> delegate;
@property (nonatomic, strong) UICollectionView *collectionView;

@property (nonatomic, assign) NSInteger index; // [tablview indexPathForCell:] not work before cell is render

@end

Cell.m

//Cell.m
#import "MTTableViewCell.h"

@interface MTTableViewCell()

@end

@implementation MTTableViewCell


- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {
        UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init];
        _collectionView = [[UICollectionView alloc] initWithFrame:self.bounds collectionViewLayout:layout];
    }
    return self;
}

#pragma mark - 

- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {
    if (_delegate && [_delegate respondsToSelector:@selector(    collectionView:numberOfItemsInSection:InTableViewCell:)]) {
        return [_delegate collectionView:collectionView numberOfItemsInSection:section InTableViewCell:self];
    }
    return 0;
}

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(    NSIndexPath *)indexPath {
    if (_delegate && [_delegate respondsToSelector:@selector(    collectionView:cellForItemAtIndexPath:InTableViewCell:)]) {
        return [_delegate collectionView:collectionView cellForItemAtIndexPath:indexPath     InTableViewCell:self];
    }
    return nil;
}

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)    collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath {
    return CGSizeMake(50, 50);
}

@end

ViewController.m

#import "ViewController.h"
#import "MTTableViewCell.h"

@interface ViewController ()<UITableViewDataSource,UITableViewDelegate,MTTableViewCellDelegate>

@property (nonatomic, strong) UITableView *tableView;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    _tableView = [[UITableView alloc] initWithFrame:self.view.bounds style:UITableViewStylePlain];
    _tableView.delegate = self;
    _tableView.dataSource = self;

    _tableView.rowHeight = 72.0;

    [self.view addSubview:_tableView];


}
#pragma mark - UITableViewDataSource & UITableViewDelegate

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    MTTableViewCell *cell = (MTTableViewCell*) [tableView dequeueReusableCellWithIdentifier:@"Cell"];
    if (!cell) {
        cell = [[MTTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"Cell"];
    }
    cell.index = indexPath.row;
    cell.delegate = self;
    [cell.collectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:@"CCell"];

    return cell;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return 5;
}

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(    NSIndexPath *)indexPath {

    MTTableViewCell *mtCell = (MTTableViewCell *)cell;
    if (!mtCell.collectionView.superview) {
        [mtCell addSubview:mtCell.collectionView];
        mtCell.collectionView.delegate = mtCell;
        mtCell.collectionView.dataSource = mtCell;
    }
}

#pragma mark - MTTableViewCellDelegate

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(    NSIndexPath *)indexPath InTableViewCell:(MTTableViewCell *)cell {
    UICollectionViewCell *cCell = [collectionView dequeueReusableCellWithReuseIdentifier:@"CCell"     forIndexPath:indexPath];
    cCell.backgroundColor = [UIColor redColor];
    return cCell;
}

- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section     InTableViewCell:(MTTableViewCell *)cell {

    [_tableView indexPathForCell:cell];

    return cell.index
    ;
}

@end

希望这可以帮助你:)