如何从 UITableView (iPhone/iPad) 中删除部分
Posted
技术标签:
【中文标题】如何从 UITableView (iPhone/iPad) 中删除部分【英文标题】:How to delete section from UITableView (iPhone/iPad) 【发布时间】:2012-05-31 13:16:54 【问题描述】:我正在尝试想出一种从表视图中删除部分的好方法(就编码和外观而言)。理想情况下,我想创建一种删除部分的方法,该方法类似于删除UITableViewCell
的过程(即,按下时显示红色删除按钮的红色减号按钮)。
是否有任何预先存在的解决方案来解决这个问题?我已经尝试对这些区域进行一些研究,但我真的找不到任何有用的东西。如果没有预先存在的解决方案,我想我可以尝试实施一个。我的计划是为每个部分创建一个自定义标题。在自定义标题中,我将添加删除按钮,这些按钮的反应方式与删除行时的反应方式相同。人们认为这会奏效吗?
为了清楚起见,我想问是否存在删除UITableView
中部分的现有解决方案。如果没有,那么我想知道人们是否认为我的想法可行,或者我是否忽略了任何问题。
提前致谢。
【问题讨论】:
【参考方案1】:实现自己的 headerView 是要走的路。 Apple 不提供用于删除部分的内置用户界面。如果你拉下 ios 设备的通知区域,你就会知道如何让它看起来不错。
实现也不是很复杂。我用过这样的东西:
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
return 21.0f;
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
UIView *headerView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 21)];
headerView.backgroundColor = [UIColor lightGrayColor];
UILabel *headerLabel = [[UILabel alloc] initWithFrame:CGRectMake(8, 0, 250, 21)];
headerLabel.text = [NSString stringWithFormat:@"Section %d", section];
headerLabel.font = [UIFont boldSystemFontOfSize:[UIFont systemFontSize]];
headerLabel.textColor = [UIColor whiteColor];
headerLabel.backgroundColor = [UIColor lightGrayColor];
[headerView addSubview:headerLabel];
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
button.tag = section + 1000;
button.frame = CGRectMake(300, 2, 17, 17);
[button setImage:[UIImage imageNamed:@"31-circle-x"] forState:UIControlStateNormal];
[button addTarget:self action:@selector(deleteButtonPressed:) forControlEvents:UIControlEventTouchUpInside];
[headerView addSubview:button];
return headerView;
- (IBAction)deleteButtonPressed:(UIButton *)sender
NSInteger section = sender.tag - 1000;
[self.objects removeObjectAtIndex:section];
[self.tableView deleteSections:[NSIndexSet indexSetWithIndex:section] withRowAnimation:UITableViewRowAnimationAutomatic];
// reload sections to get the new titles and tags
NSInteger sectionCount = [self.objects count];
NSIndexSet *indexes = [NSMutableIndexSet indexSetWithIndexesInRange:NSMakeRange(0, sectionCount)];
[self.tableView reloadSections:indexes withRowAnimation:UITableViewRowAnimationNone];
【讨论】:
self.objects 是什么?【参考方案2】:是的,有现有方法可用于删除 tableview 中的部分。您可以使用以下方法:
[m_TableView beginUpdates];
[m_TableView deleteSections:[NSIndexSet indexSetWithIndex:1] withRowAnimation:UITableViewRowAnimationTop];
[m_TableView endUpdates];
但是当你删除你必须修改的部分时,你必须记住一件事:
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
因为现在你的节数减少了 1。
【讨论】:
【参考方案3】:如果我是正确的,Apple 只在 UITableView 编辑模式下提供行删除。
我可以想到 3 种添加按钮来删除特定部分的方法。
首先,在UITableView
的部分之外放置一个按钮,它不会在UITableView
内(我认为您不能在UITableView
内的部分标题之外放置一个按钮,或者也许你可以,但我不知道该怎么做)。您可以检查UITableView
是否处于可编辑模式并相应地显示或隐藏您的按钮。
第二,如果您确实想要UITableView
中的删除按钮,您可以创建自定义 UITableViewCell 并将部分删除按钮放在单元格内。这样每个UITableViewCell
都会有一个按钮,这不是很好。
第三种选择是不提供任何按钮,只是让用户以 Apple 默认方式删除单元格。您所做的只是继续跟踪数组中用于填充该部分的对象数量。如果计数为 0,则删除该部分。
这是我之前做过的类似事情:
我有一个 NSMutableArray
firstLevelArray 包含几个 NSMutableArray
secondLevelArray 里面每个都包含一些对象。因此,每个 secondLevelArray 将为一个部分提供数据,而 secondLevelArray 中的一个对象将为每个单元格提供数据。在- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
中,我执行return [firstLevelArray count];
,无论我想删除一个部分,在[firstLevelArray removeObjectAtIndex:someIndex]
之后,我执行[myTableView reloadData]
希望对你有帮助
【讨论】:
以上是关于如何从 UITableView (iPhone/iPad) 中删除部分的主要内容,如果未能解决你的问题,请参考以下文章
如何从 SearchResultDetailView 返回 UITableView
如何从 UITableView 推送到新的 viewController?
如何从 UITableView 获取行索引,其中数组列表由追加到类
从 UITableView 插入和删除行时如何正确更新数据源?