如何创建可扩展的UITableView部分?

时间:2014-10-03 20:13:30

标签: ios objective-c uitableview

目前,我的每个UITableView部分都包含10行。我想要的是每个部分初始化那10行,但只显示3.如果用户点击“显示更多”按钮,则会显示所有10个。我想通过在隐藏部分使用类似的东西来做到这一点:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{    
    float heightForRow = 65;

    if(cell.tag>=3)
        return 0;
    else
        return heightForRow;
}

这意味着要隐藏除前3行之外的所有行。问题是我收到一条错误陈述use of undeclared identifier 'cell'。我在cell中初始化cellForRowAtIndexPath,如此:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    // Initialize cell
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (!cell) {
        // if no cell could be dequeued create a new one
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
    }

    // No cell seperators = clean design
    tableView.separatorColor = [UIColor clearColor];

    // title of the item
    cell.textLabel.text = _matchCenterArray[indexPath.section][@"Top 3"][indexPath.row][@"Title"];
    cell.textLabel.font = [UIFont boldSystemFontOfSize:14];

    // price of the item
    cell.detailTextLabel.text = [NSString stringWithFormat:@"$%@", _matchCenterArray[indexPath.section][@"Top 3"][indexPath.row][@"Price"]];
    cell.detailTextLabel.textColor = [UIColor colorWithRed:0/255.0f green:127/255.0f blue:31/255.0f alpha:1.0f];

    // image of the item
    NSData *imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:_matchCenterArray[indexPath.section][@"Top 3"][indexPath.row][@"Image URL"]]];
    [[cell imageView] setImage:[UIImage imageWithData:imageData]];

    return cell;

}

如何在cell中访问heightForRowAtIndexPath

2 个答案:

答案 0 :(得分:3)

如果你可以在这里使用第三方库,那就可以了:

SLExpandableTableView

实施它的步骤

UITableViewController

中加载 SLExpandableTableView
- (void)loadView
{
    self.tableView = [[SLExpandableTableView alloc] initWithFrame:CGRectZero style:UITableViewStylePlain];
}

实施 SLExpandableTableViewDatasource 协议

- (BOOL)tableView:(SLExpandableTableView *)tableView canExpandSection:(NSInteger)section
{
    // return YES, if the section should be expandable
}

- (BOOL)tableView:(SLExpandableTableView *)tableView needsToDownloadDataForExpandableSection:(NSInteger)section
{
    // return YES, if you need to download data to expand this section. tableView will call tableView:downloadDataForExpandableSection: for this section
}

- (UITableViewCell<UIExpandingTableViewCell> *)tableView:(SLExpandableTableView *)tableView expandingCellForSection:(NSInteger)section
{
    // this cell will be displayed at IndexPath with section: section and row 0
}

实施 SLExpandableTableViewDelegate 协议

- (void)tableView:(SLExpandableTableView *)tableView downloadDataForExpandableSection:(NSInteger)section
{
    // download your data here
    // call [tableView expandSection:section animated:YES]; if download was successful
    // call [tableView cancelDownloadInSection:section]; if your download was NOT successful
}

- (void)tableView:(SLExpandableTableView *)tableView didExpandSection:(NSUInteger)section animated:(BOOL)animated
{
  //...
}

- (void)tableView:(SLExpandableTableView *)tableView didCollapseSection:(NSUInteger)section animated:(BOOL)animated
{
  //...
}

答案 1 :(得分:1)

您可以使用

获取每个单元格
UITableViewCell* cell = [self.tableView cellForRowAtIndexPath:indexPath];

另一种方法,如果要显示的单元格按顺序排在前3位,而不是使用cell.tag,则可以使用

if (indexPath.row > 3 || self.hasPressedShowMoreButton){
return 0;
}

将bool hasPressedShowMoreButton添加到tableview类

当他们按下show more按钮时你可以让按钮事件处理程序设置bool并重新加载tableview

-(IBAction)pressedShowMoreButton{
self.hasPressedShowMoreButton = YES;
[self.tableView reloadData];
}

我认为比使用标签更清洁

在任何一种情况下,请确保在用户点击show more按钮时重新加载表格视图。