How to make a Sub Table view in a TableViewCell

断了今生、忘了曾经 提交于 2020-01-11 14:13:28

问题


I have a TableView displaying a list of domain :

- (void)viewDidLoad
{
    [super viewDidLoad];
// Do any additional setup after loading the view.
    self.tableView.dataSource = mainClass.domainList;
}

The domain list is set up like that :

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return [self.domainList count];
}

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [[UITableViewCell alloc] init];
    cell.textLabel.text = [[self.domainList objectAtIndex:indexPath.row] name];

    return cell;
}

This works perfectly, it displays each domain in a row of my table view.

Now i would like to add a "Sub TableView" in each cell of my Table View to display a list of documents related to the domain. I tried that :

 -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{

    UITableView *table = [[UITableView alloc] init];
    table.dataSource = [self.domainList objectAtIndex:indexPath.row];

    UITableViewCell *cell = [[UITableViewCell alloc] init];
    cell.textLabel.text = [[self.domainList objectAtIndex:indexPath.row] name];
    [cell.contentView addSubView table]

    return cell;
}

It doesn't crash but it doesn't work neither. I mean the sublist doesn't appear anywhere. What am i doing wrong?


回答1:


datasource must be a class implementing the protocol UITableViewDataSource. It looks like you are setting it to a custom object. Create a separate class with the code you used to implement the first table, then set the sublist as source data. In the objc.io article “clean table view code” they explain how to make reusable datasources. Or you can just give it a try on your own.

Consider this code:

// ARRAYDATASOURCE.H

#import <Foundation/Foundation.h>

typedef void (^TableViewCellConfigureBlock)(id cell, id item);

@interface ArrayDataSource : NSObject <UITableViewDataSource>

-(id) init __attribute__((unavailable("disabled, try initWithItems:cellIdentifier:configureCellBlock")));

- (id) initWithItems:(NSArray *)anItems
      cellIdentifier:(NSString *)aCellIdentifier
  configureCellBlock:(TableViewCellConfigureBlock)aConfigureCellBlock;

- (id)itemAtIndexPath:(NSIndexPath *)indexPath;

@end


// ARRAYDATASOURCE.M

#import "ArrayDataSource.h"

@interface ArrayDataSource ()
@property (nonatomic, strong) NSArray *items;
@property (nonatomic, copy) NSString *cellIdentifier;
@property (nonatomic, copy) TableViewCellConfigureBlock configureCellBlock;
@end

@implementation ArrayDataSource

- (id)initWithItems:(NSArray *)anItems
     cellIdentifier:(NSString *)aCellIdentifier
 configureCellBlock:(TableViewCellConfigureBlock)aConfigureCellBlock
{
    self = [super init];
    if (self) {
        self.items = anItems;
        self.cellIdentifier = aCellIdentifier;
        self.configureCellBlock = [aConfigureCellBlock copy];
    }
    return self;
}

- (id)itemAtIndexPath:(NSIndexPath *)indexPath
{
    return self.items[(NSUInteger) indexPath.row];
}

#pragma mark UITableViewDataSource

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return self.items.count;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:self.cellIdentifier
                                                            forIndexPath:indexPath];
    id item = [self itemAtIndexPath:indexPath];
    self.configureCellBlock(cell, item);
    return cell;
}

@end


来源:https://stackoverflow.com/questions/21758982/how-to-make-a-sub-table-view-in-a-tableviewcell

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!