在UITableView中点击时,找出节标题的一部分

时间:2011-12-12 03:52:19

标签: iphone uiview uitableview

我有一个UITableView,其中包含节标题的自定义视图。我在客户部分标题视图中添加了一个UITapGestureRecognizer,以检测是否有人点击了部分标题。

如何确定节标题属于哪个部分?

提前致谢。

5 个答案:

答案 0 :(得分:2)

最简单的方法是在节标题视图类上指定一个属性来保存节索引,然后在-tableView:viewForHeaderInSection:中将索引分配给该属性,如下所示:

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
    // CustomHeaderView *headerView = ...

    headerView.section = section;

    // ...
    return headerView;
}

然后让手势回调查看该属性。

答案 1 :(得分:1)

您提供的action方法必须包含following signature

- (void)handleGesture:(UIGestureRecognizer *)gestureRecognizer;

gestureRecognizer具有以下属性:

  

获取识别器的状态和视图
    国家财产
    查看财产
    启用属性

所以基本上你可以要求它附加并查询该视图的视图。

答案 2 :(得分:1)

在viewDidLoad部分插入你的gestureRecognizer:

- (void)viewDidLoad
{
    (...)

    UITapGestureRecognizer* doubleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(doubleTapTable:)];
    doubleTap.numberOfTapsRequired = 2;
    doubleTap.numberOfTouchesRequired = 1;
    [self.yourTable addGestureRecognizer:doubleTap];

    (...)

}

如果您只想检测单击更改doubleTap.numberOfTapsRequired为1。

然后添加以下方法。这将检查点击点是否在节标题内:

-(void)doubleTapTable:(UISwipeGestureRecognizer*)tap
{
    if (UIGestureRecognizerStateEnded == tap.state)
    {
        CGPoint p = [tap locationInView:tap.view];

        NSIndexPath* indexPath = [yourTable indexPathForRowAtPoint:p];

        if(indexPath){  // user taped a cell

            // whatever you want to do if user taped cell

        } else { // otherwise check if section header was clicked 

            NSUInteger i;

            for(i=0;i<[yourTable numberOfSections];i++) {

                CGRect headerViewRect = [yourTable rectForHeaderInSection:i];

                BOOL isInside = CGRectContainsPoint (headerViewRect,
                                                     p);
                if(isInside) {

                    // handle Header View Selection

                    break;
                }

            }
        }

    }
}

答案 3 :(得分:0)

这里的派对有点晚了,但这可能是一个难以解决的问题,特别是如果(正如@klyngbaek在评论中提到的那样),你正在添加/删除部分。通过重新加载整个部分来更改标题UIView上的标记或自定义索引属性可能会导致丑陋的动画。

尝试将此作为附加到每个标题UIView的手势识别器的回调方法(诚然是hackey):

- (void)headerTapped:(UITapGestureRecognizer *)sender{

    NSInteger section = 0;
    for(int counter = 0; counter < [self.tableViewOfInterest numberOfSections]; counter++){
        if([[self.tableViewOfInterest headerViewForSection:counter] frame].origin.y == sender.view.frame.origin.y){
            section = counter;
            break;
        }
    }

}

基本上,当为每个节标题询问UITableView时,它会返回标题的实例,并将框架设置为表格中标题的位置。将其与UITapGestureRecognizer的{​​{1}}属性的框架进行比较,将会在某个时刻产生匹配(无双关语)!

答案 4 :(得分:0)

您可以在标题中添加按钮,并将标记设置为按钮,如下所示:

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:
(NSInteger)section {
    UIView *headerView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, tableView.frame.size.height, tableView.frame.size.width)];
    UIButton *button = [[UIButton alloc] initWithFrame:headerView.frame];
    button.tag = section;
    [button addTarget:self action:@selector(detectSection:) forControlEvents:UIControlEventTouchUpInside];
    [headerView addSubView:button];
    return headerView;
}

-(void)detectSection:(UIButton *)sender {
    switch(sender.tag) {
    //your code
    }
}