表格中有一些部分不包含任何数据,并希望隐藏该部分。
怎么做?
答案 0 :(得分:52)
实际上,你可以“隐藏”某个部分。如果您想对内置联系人应用程序使用类似的行为,其中部分被隐藏但仍然在右侧的索引中列出,您可以执行以下操作:
实施UITableViewDataSource
协议:
在sectionIndexTitlesForTableView
方法中返回所有部分名称(甚至是隐藏的部分名称。
对于每个空白部分,请从nil
方法返回titleForHeaderInSection
。
对于0
方法,每个空部分返回numberOfRowsInSection
。
我发现这比删除部分更有效,因为用户具有一致的索引导航。
答案 1 :(得分:22)
您无法“隐藏”某个部分,但可以使用deleteSections:withRowAnimation:
方法从表格视图中“删除”该部分。这将使用可选动画将其从视图中删除,而不会影响您的后备数据。 (但是,您应该更新数据,以便不再出现该部分。)
答案 2 :(得分:14)
确实0不是页眉和页脚的有效高度。但是,高度是CGFloat值。您可以为部分页眉和页脚的高度指定一个非常小的数字(我使用过0.1)。
有点黑客,但它确实有效。
答案 3 :(得分:5)
我不同意蒂姆。我们可以从代码中的任何位置访问表的任何部分/行,并更改其.hidden属性(以及所有其他属性)。
这是我通常使用的方式:
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:2];
[self.SeymourCakesTableView cellForRowAtIndexPath:indexPath].hidden = YES;
答案 4 :(得分:2)
您可以将该部分中的行数设置为0.但是,它会留下一个明显的空白区域。
答案 5 :(得分:2)
您还可以返回包含数据的记录数
numberofSectionsInTableView:
方法和使用方法
switch(indexPath.section)
你让空记录'通过'到下一个开关,如:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
switch (indexPath.section) {
case 0:
return <header cell>;
break;
case 1:
if(firstRecordHasData){
return <second cell>;
break;
}
case 2:
if(secondRecordHasData){
return <second cell>;
break;
}
case 3:
return <some other cell>;
break;
default:
return <a regular cell>;
break;
}
}
我一直在努力解决这个问题,因为我不得不在分组表的中间省略部分。尝试将单元格,页眉和页脚高度设置为0.0,但这不起作用。由于所调用的方法取决于所选行,因此无法删除某些部分。这将是一个巨大的if..else if ... else如果有多个子程序调用。 很高兴我想到了很好的旧开关方法,也许它对你有所帮助: - )
答案 6 :(得分:1)
您可能需要从支持表格的数据中删除该部分本身。我认为没有任何东西可以让你隐藏一个部分。
答案 7 :(得分:1)
您可以将特定部分行高度设置为0.此外,如果需要,还可以使用部分标题。数据源仍然存在,只是没有出现。
部分行
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
if (indexPath.section == 0) {
if (_shouldHidden) {
return 0.0;
}
else {
return 55.0;
}
}
else {
return 55.0;
}
}
答案 8 :(得分:1)
如果您为该部分的高度返回0,Apple API将忽略它。所以只返回一个大于0的小值。
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
if (section == 0) {
return 1;
}
return 44;
}
还为您不想显示的部分实现标题的视图和返回nil。
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
if (section == 0 && !self.personaCells.count) {
return nil;
}
UIView *headerView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, tableView.frame.size.width, 44)];
UILabel *headerLabel = [[UILabel alloc] initWithFrame:CGRectMake(15, 20, headerView.frame.size.width, 20)];
NSString *headerTitle = @"SAMPLE TITLE";
headerLabel.text = headerTitle;
[headerView addSubview:headerLabel];
return headerView;
}
答案 9 :(得分:0)
试试这样: -
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
CGFloat headerHeight=10.f;
if (section==0)
{
headerHeight=0.01f;
}
else
{
headerHeight=50.0f;
}
return headerHeight;
}
答案 10 :(得分:0)
对于静态表的情况,即在Storyboard中配置表部分和单元格。以下是根据条件隐藏指定部分的策略。
第一步:实施func
中定义的两个UITableViewDelegate
- heightForRowAt
- heightForHeaderInSection
例如,这里有快速代码:
override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat
{
// if indexPath contains the specified section AND
// the condition for hiding this section is `true`
// return CGFloat(0)
// else
// return super.tableView(tableView, heightForRowAt: indexPath)
}
override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat
{
// similar logic to set header height
}
第二步:定义一个func来为特定部分设置隐藏的单元格并从viewWillAppear中调用它:
private func setSectionVisible()
{
/*
if condition for visible is true
let index = IndexPath(row:..., section:...)
let cell = self.tableView.cellForRow(at: index)
cell.isHiden = true
*/
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
self.setSectionVisible()
}
如果您需要重新加载tableview,可能需要再次致电setSectionVisible()
。
我认为这种策略可能适用于DataSource的动态数据。通过这种方式,您可以控制何时使特定部分可见或隐藏。
答案 11 :(得分:0)
对于隐藏部分,即使在表格视图的中间,您也需要以下所有
#define DEBUG_SECTION 1
#if ! DEBUG_BUILD
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
if (section == DEBUG_SECTION)
return CGFLOAT_MIN;
return [super tableView:tableView heightForHeaderInSection:section];
}
//------------------------------------------------------------------------------
- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section
{
if (section == DEBUG_SECTION)
return CGFLOAT_MIN;
return [super tableView:tableView heightForFooterInSection:section];
}
//------------------------------------------------------------------------------
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
{
if (section == DEBUG_SECTION)
return nil;
return [super tableView:tableView titleForHeaderInSection:section];
}
//------------------------------------------------------------------------------
- (NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section
{
if (section == DEBUG_SECTION)
return nil;
return [super tableView:tableView titleForFooterInSection:section];
}
//------------------------------------------------------------------------------
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
if (section == DEBUG_SECTION)
return 0;
return [super tableView:tableView numberOfRowsInSection:section];
}
//------------------------------------------------------------------------------
#endif // #if ! DEBUG_BUILD
如果你遗漏了titleFor / headerFor ...你会得到一些空行 如果你遗漏了heightFor ...标题/页脚标题文本仍然会出现