如何识别节标题视图的节号

时间:2013-06-05 16:54:39

标签: ios uitableview

UITableView的标题中有一个按钮。一旦按下内部按钮,我们怎么知道该按钮属于哪个部分?由于tableview是可编辑的,因此在删除某些行时设置按钮的标记并不好。我已经尝试使用indexPathForRowAtPoint:来获取第一行的indexPath属于该部分,但发生了一些奇怪的事情。有没有更好的方法?

编辑1:

使用标记标识标题的节号后,删除某行时标记不会更新。你可以重新加载tableview来更新标签,但看起来不太好。

对于indexPathForRowAtPoint:的奇怪行为,我发布了另一个问题:Weird behavior of UITableView method "indexPathForRowAtPoint:"

3 个答案:

答案 0 :(得分:3)

上面的答案对我来说似乎已经足够了,但是,如果您不想使用标签,您可以创建一个方法来返回特定视图所属的UITableView部分,如下所示:

-(int)sectionNumberForView:(UIView*)view inTableView:(UITableView*)tableView {

    int numberOfSections = [tableView numberOfSections];

    int i=0;
    for(; i < numberOfSections; ++i) {
        UIView *headerView = [tableView headerViewForSection:i];
        if (headerView == view) {
            break;
        }
    }

    return i;
}

然后在Target-Action方法中,假设你的按钮的超级视图是节标题视图:

-(void)buttonPressed:(UIButton*)sender {

    int section = [self sectionNumberForView:sender.superview inTableView:_yourTableView];
}

希望这有帮助!

答案 1 :(得分:3)

我喜欢@LuisCien的答案,因为OP希望避免使用标签。但是(a)答案应该显示如何从按钮到该部分,无论在标题视图的层次结构中找到按钮的深度,以及(b)提供的答案将第0部分与未找到标题的情况相混淆(如果方法传递的是未包含在标头中的视图)。

// LuisCien's good suggestion, with modified test and a NotFound return.

-(NSInteger)sectionNumberForView:(UIView*)view inTableView:(UITableView*)tableView {

    NSInteger numberOfSections = [tableView numberOfSections];

    for(NSInteger i=0; i < numberOfSections; ++i) {
        UIView *headerView = [tableView headerViewForSection:i];
        if ([view isDescendantOfView:headerView]) return i;
    }

    return NSNotFound;
}

无需使用插座的超级视图来调用它。让后代检查做那项工作。

NSInteger section = [self sectionNumberForView:sender inTableView:_yourTableView];

答案 2 :(得分:1)

创建每个headerView并添加UIButton时,可以将其标记设置为该部分的值,并在操作方法中检查该按钮的标记。有点像...

在你的创作中:

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
    UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 100)];

    UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
            button.frame = CGRectMake(10, 10, 20, 20);
            [button setTag:section];
            [button addTarget:self action:@selector(buttonPressed:) forControlEvents:UIControlEventTouchUpInside];

    [view addSubview:button];

    return view;
}

然后在你的行动方法中:

- (void)buttonPressed:(UIButton *)sender
{
    int section = sender.tag;

    // Do something based on the section
}