当表处于编辑模式时,在UITableView部分标题上切换UIButton

时间:2014-07-01 08:25:34

标签: ios objective-c uitableview custom-view sectionheader

我有一个自定义视图,其UILabelUIButton用于我的分组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的东西,但是没有这样的暴露方法...... :(

2 个答案:

答案 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中调用它根本不需要。