我有一个自定义视图,其UILabel
和UIButton
用于我的分组UITableView
部分标题,如下所示:
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
sectionHeaderView *headerView = [[sectionHeaderView alloc] initWithFrame:CGRectMake(0, 0, 320, 40)];
[headerView.label setText:[[self tableView:tableView titleForHeaderInSection:section] uppercaseString]];
if (_tableView.editing)
[headerView.button setHidden:NO];
return headerView;
}
如您所见,我想在UITableView
处于编辑模式时取消隐藏按钮。
我使用UITableView
类别方法返回visibleHeaders,以便我可以刷新可见的节头视图,而无需调用reloadData或reloadSections:withRowAnimation。该方法基本上返回一个NSNumber对象数组,并且效果很好。
以下是在编辑模式下设置UITableView
的方法:
- (void)tapThatEditButtonBaby
{
[_tableView setEditing:YES animated:YES];
for (NSNumber *sectionNumber in _tableView.visibleHeaders) {
NSInteger section = [sectionNumber integerValue];
sectionHeaderView *headerView = (sectionHeaderView *)[self tableView:_tableView viewForHeaderInSection:section];
[headerView setBackgroundColor:[UIColor redColor]]; // highlighting view for testing.
}
}
解决这个问题的好方法是什么?理想情况下,在我看来,我希望能够从UITableView
调用类似updateSectionAndFooterAtIndex的东西,但是没有这样的暴露方法...... :(
答案 0 :(得分:2)
<强>更新强>
很抱歉,我没有注意到你有任何部分的标题。 所以解决方案对你的情况几乎是一样的。您可以将带有部分索引的NSDictionary存储为关键字和您感兴趣的按钮以获取价值。这个字典将填入你的 - (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)这样的部分:
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
//...
[self.buttonsToHideInEditMode setObject:headerView.button forKey:@(section)];
}
并在你的 - (无效)tapThatEditButtonBaby:
- (void)tapThatEditButtonBaby {
...
[self.buttonsToHideInEditMode enumerateObjectsUsingBlock:^(UIButton *obj, NSUInteger idx, BOOL *stop) {
obj.hidden = !_tableView.editing);
}];
}
上一个回答
实际上你有两个(或更多:))基本选项:
1)创建单独的方法来创建页眉/页脚视图,如:
- (UIView *)tableHeaderView
{
sectionHeaderView *headerView = [[sectionHeaderView alloc] initWithFrame:CGRectMake(0, 0, 320, 40)];
[headerView.label setText:[[self tableView:tableView titleForHeaderInSection:section] uppercaseString]];
if (_tableView.editing)
[headerView.button setHidden:NO];
return headerView;
}
//same way for -(UIView *)tableFooterView;
然后,任何时候你想要更新/创建页眉/页脚只需要调用:
_tableView.tableFooterView = [self tableFooterView];
//or
_tableView.tableHeaderView = [self tableHeaderView];
2)在您的情况下,如果您只想根据编辑状态更改按钮,您只需为按钮创建属性,并在需要时更改它。
答案 1 :(得分:-1)
实际上我发现我的问题就是如果直接对视图属性进行了更改,那么对于标题页面视图的视觉更改不会得到更新。
如果我在我的sectionHeaderView
中添加此方法setEditing:animated:
- (void)setEditing:(BOOL)editing animated:(BOOL)animated
{
if (animated) {
[UIView animateWithDuration:0.25 animations:^{
if (editing) {
[label setFrame:CGRectMake(50, 15, 200, 20)];
[button setFrame:CGRectMake(10, 12, 25, 25)];
}
else {
[label setFrame:CGRectMake(15, 15, 200, 20)];
[button setFrame:CGRectMake(-30, 12, 25, 25)];
}
}];
}
}
基本上下面是我的tapThatEditButtonBaby方法:
- (void)tapThatEditButtonBaby
{
[_tableView setEditing:YES animated:YES];
for (NSNumber *sectionNumber in _tableView.visibleHeaders) {
NSInteger section = [sectionNumber integerValue];
sectionHeaderView *headerView = (sectionHeaderView *)[self tableView:_tableView viewForHeaderInSection:section];
[sectionHeaderView setEditing:YES animated:YES]; // these visual changes work
[sectionHeaderView.label setFrame:....]; // these changes don't...
}
}
编辑:
UITableView
会自动将setEditing:animated发送到其层次结构中实现它的任何子视图。这是非常有用的知识。基本上我发现在tapThatEditButtonBaby中调用它根本不需要。