我已经查看了很多关于如何通过覆盖UITableViewCell
来隐藏静态heightForRowAtIndexPath
的示例,虽然我现在已经开始工作但它看起来很麻烦我想要看看我做错了什么。
我有一个UITableViewController
,其表格视图大约有8行。我的应用程序中的此屏幕显示单个对象,因此例如一行是描述,一行是图像,一个是地图视图等。所有行都是静态的。
在某些情况下,显示的某些对象没有地图,因此我想要隐藏包含mapview
的行。由于它是一个静态行,我想通过为该行设置一个outlet属性(例如@property (weak, nonatomic) IBOutlet UITableViewCell *mapViewRow;
),然后我可以以某种方式将该行的高度设置为0或隐藏viewDidLoad
或{{中的那一行1}}。但是,似乎唯一的方法是覆盖viewWillAppear
方法,这有点烦人,因为我需要在代码中硬编码地图行的索引,例如。
heightForRowAtIndexPath
当然,这并不是什么大不了的事,但只是在- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
if (indexPath.row == 6 && self.displayItem.shouldHideMap) {
return 0;
}
return [super tableView:tableView heightForRowAtIndexPath:indexPath];
}
中调整静态行的整个方式似乎就像在第一个故障板中设置它们一样的地方。
答案 0 :(得分:2)
编辑 - 我的回答背后的理由
要更改行的高度,必须重新加载整个表或包含该行的子集。 B / c在表中有一行w /零高度有点奇怪,我更喜欢修改你的数据源,使得表中不存在该行。
有很多方法可以做到这一点。您可以从displayItem构建一个数组,其中数组中的每一行对应于表中具有适当数据的行。您将重建此数组,然后调用[tableView reloadData]
。我的原始答案还可以通过将每个数据元素视为具有0或1行的节来消除不需要的行。
原始回答
您的tableview是简单的还是分组的样式?如果它是普通样式,则可以将每行视为包含0或1行的部分。在tableView dataSource和delegate方法中,您将使用section index来标识您关注该部分的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
答案 1 :(得分:0)
您可以覆盖heightForRowAtIndexPath
并在其中加return UITableViewAutomaticDimension;
这将使单元格自动计算高度UILabel
高度为> =。它对我有用。