3

我已经查看了很多关于如何UITableViewCell通过覆盖来隐藏静态的示例heightForRowAtIndexPath,虽然我现在已经让它工作了,但它看起来很麻烦,我想看看我是否做错了什么。

我有一个UITableViewController大约有 8 行的表格视图。我的应用程序中的这个屏幕显示了一个对象,例如,一行是描述,一个是图像,一个是地图视图,等等。所有的行都是静态的。

在某些情况下,显示的某些对象没有地图,因此我想隐藏包含mapview. 由于它是一个静态行,我在想通过为该行设置一个出口属性(例如@property (weak, nonatomic) IBOutlet UITableViewCell *mapViewRow;),然后我可以以某种方式将该行的高度设置为 0 或将该行隐藏在viewDidLoador中viewWillAppear。但是,似乎唯一的方法是重写该heightForRowAtIndexPath方法,这有点烦人,因为我需要在我的代码中硬编码地图行的索引,例如

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    if (indexPath.row == 6 && self.displayItem.shouldHideMap) {
        return 0;
    }
    return [super tableView:tableView heightForRowAtIndexPath:indexPath];
}

当然,没什么大不了的,但只是在 a 中调整静态行大小的整个方式tableview似乎违背了首先在情节提要中设置它们的意义。

4

2 回答 2

2

编辑- 我回答背后的理由

要更改行的高度,您必须重新加载整个表或包含该行的子集。B/c 在表格中有一行零高度有点奇怪,我更喜欢修改您的数据源,以使表格中不存在该行。

有很多方法可以做到这一点。您可以从 displayItem 构建一个数组,其中数组中的每一行对应于表中带有适当数据的行。您将重建此数组,然后调用[tableView reloadData]. 我最初的答案还将通过将每个数据元素视为具有 0 或 1 行的部分来消除不需要的行。

原始答案

您的 tableview 是普通样式还是分组样式?如果它是一种简单的样式,您可以将每一行视为一个包含 0 或 1 行的部分。在您的 tableView 数据源和委托方法中,您将使用部分索引来识别self.displayItem您关心的该部分中的数据。

您的代码将类似于:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return 8; // max number of possible rows in table
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    NSInteger rows = 1;

    // set self.mapSectionIndex during initialization or hard code it
    if (section == self.mapSectionIndex && self.displayItem.shouldHideMap) {
        rows = 0;
    }
    return rows;
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:indexPath
{
    return 60.0f; // whatever you want the height to be
}

// also modify tableView:cellForRowAtIndexPath: and any other tableView delegate and dataSource methods appropriately
于 2013-04-10T01:49:32.243 回答
0

您可以覆盖 heightForRowAtIndexPath并在其中写入return UITableViewAutomaticDimension;这将使单元格自动计算高度,因为UILabel高度是 >= 。它对我有用。

于 2015-06-03T05:08:21.353 回答