2

我的标题中有一个按钮UITableView。一旦按钮被触摸到里面,我们怎么知道按钮属于哪个部分?由于 tableview 是可编辑的,因此当删除某些行时,设置按钮的标签不是很好。我曾尝试使用indexPathForRowAtPoint:获取第一行的 indexPath 属于该部分,但发生了一些奇怪的事情。有没有更好的方法?

编辑1:

一旦标签被用于识别标题的节号,当某行已被删除时,标签将不会更新。因为你可以重新加载 tableview 来更新标签,但它似乎不是那么好。

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

4

3 回答 3

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];
}

希望这可以帮助!

于 2013-06-05T17:33:40.700 回答
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];
于 2013-06-05T21:29:47.940 回答
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
}
于 2013-06-05T17:04:28.750 回答