如何从Storyboard中创建的静态UITableView中删除单元格
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何从Storyboard中创建的静态UITableView中删除单元格相关的知识,希望对你有一定的参考价值。
这应该很容易,但我遇到了麻烦。
我有一个带有单元格的静态UITableView,如果不需要,我想以编程方式删除它。
我有一个IBOutlet
IBOutlet UITableViewCell * cell15;
我可以通过电话将其删除
cell15.hidden = true;
这隐藏了它,但留下了一个空白的空间,细胞曾经是,我无法摆脱它。
也许黑客会将它的高度改为0?
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:indexPath
{
//what would I put here?
}
非常感谢!
你无法在数据源中真正处理这个问题,因为对于静态表,你甚至都没有实现数据源方法。高度是要走的路。
试试这个:
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
if (cell == cell15 && cell15ShouldBeHidden) //BOOL saying cell should be hidden
return 0.0;
else
return [super tableView:tableView heightForRowAtIndexPath:indexPath];
}
更新
看来,在自动布局下,这可能不是最好的解决方案。有一个替代的答案here可能会有所帮助。
您可以使用tableView:willDisplayCell
和tableView:heightForRowAtIndexPath
与单元格标识符来显示/隐藏静态tableview
单元格,但是您必须实现引用heightForRowAtIndexPath
的super
,而不是self
。这两种方法对我来说很好:
(void) tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
if ([cell.reuseIdentifier.description isEqualToString:@"cellCelda1"]) {
[cell setHidden:YES];
}
}
和
(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [super tableView:tableView cellForRowAtIndexPath:indexPath];
if ([cell.reuseIdentifier.description isEqualToString:@"cellCelda1"]) {
return 0;
}
return cell.frame.size.height;
}
根据表的工作方式,在数据源中,您可以根据必要的逻辑实现tableView:numberOfRowsInSection:
为该部分返回0行。
更新了您的评论:
在调用实现时,ios将填充section参数,因此您只需要一个开关来处理包含您删除/隐藏行的部分。示例如下:
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
switch(section) {
case 0: // first section of your table, change for your situation
return 0;
default:
return 0;
}
}
它只用于恒定的细胞
-(void)tableViewSearchPeopleCellHide:(BOOL)hide{
searchCellShouldBeHidden=hide;
UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:1 inSection:0]];
[self.tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:1 inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:YES];
cell.hidden=hide;
self.searchPeople.hidden=hide;//UILabel
[self.tableView reloadData];
}
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
// UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
if (searchCellShouldBeHidden) //BOOL saying cell should be hidden
return 0.0;
else
return [super tableView:tableView heightForRowAtIndexPath:indexPath];
}
您可以做的第一件事是从要隐藏的故事板中标记单元格。放一些你可以识别的标准号码。
添加此代码。
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = [super tableView:tableView cellForRowAtIndexPath:indexPath];
if (cell.tag==10) { //I have put 10 for some static cell.
cell.hidden=YES;
return 0;
}
cell.hidden = NO;
return [super tableView:tableView heightForRowAtIndexPath:indexPath];
}
将要隐藏的单元格设置为隐藏在代码中的某个位置。添加此代码:(如果您的单元格具有不同的行高,则需要覆盖更多函数)
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
int rowCount=0;
for ( int row=0; row<[super tableView:tableView numberOfRowsInSection:section]; ++row){
NSIndexPath* path=[NSIndexPath indexPathForRow:row inSection:section];
UITableViewCell* cell=[super tableView:tableView cellForRowAtIndexPath:path];
if (!cell.hidden){
++rowCount;
}
}
return rowCount;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
int realRow=-1;
for ( int row=0; row<[super tableView:tableView numberOfRowsInSection:indexPath.section]; ++row){
NSIndexPath* path=[NSIndexPath indexPathForRow:row inSection:indexPath.section];
UITableViewCell* cell=[super tableView:tableView cellForRowAtIndexPath:path];
if (!cell.hidden){
++realRow;
}
if (realRow==indexPath.row)
return cell;
}
return nil;
}
使用索引路径标识tableview高度委托中的单元格并返回0
override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
if someCondition {
if indexPath.row == 1 || indexPath.row == 2 || indexPath.row == 3 {
return 0
}
}else{
if indexPath.row == 4 {
return 0
}
}
return super.tableView(tableView, heightForRowAt: indexPath)
}
以上是关于如何从Storyboard中创建的静态UITableView中删除单元格的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Storyboard 在 Xcode6 中创建 UIButton 连接?
iOS 开发 - 如何使用自定义 Table View Controller 显示在 Interface Builder 中创建的静态单元格?
从 XIB Viewcontroller 中的 segmentcontrol 到 Storyboard Viewcontroller