我怎么知道我点击的是哪个视图?为啥按钮没有反应?

Posted

技术标签:

【中文标题】我怎么知道我点击的是哪个视图?为啥按钮没有反应?【英文标题】:How can I know which view I am clicking? And why the button no reaction?我怎么知道我点击的是哪个视图?为什么按钮没有反应? 【发布时间】:2011-08-07 15:06:18 【问题描述】:

我正在设计一个视图控制器,它有几个按钮栏,每个栏都可以点击并显示一个内容视图。比如: http://i.stack.imgur.com/m5V4Q.png

当我点击按钮栏时,它的框架会扩大,你可以看到里面的内容(这是一个按钮)。

首先,一个bar button(320*30大小)和一个contentView是一个集合,它们是listview的子视图。几个列表视图构成了整个视图。

其次,当我点击它时,列表视图将从 320*30 扩展到 320*180,其中的内容视图将从 300*0 扩展到 300 * 130(20 像素的边距)。我将 contentview 的 clipsToBounds 设置为 Yes 以确保在框架高度为 0 时不会显示 contentview 中的内容。

现在,单击可以完全按照我的意愿显示内容视图。但这里有一个问题:我无法点击其中的按钮,我尝试将他们的 userInteractionEnabled 设置为 yes 。甚至我将 contentview 设置为用户定义,我将视图的 userInteractionEnabled 设置为 yes 并覆盖 touchbegin 函数以显示 alertView。那些测试失败了,没有发现任何反应。我检查并确定不应该有任何视图覆盖它。

可能是什么原因?

设置列表视图的代码是:

        NSArray *array = [titleArray objectAtIndex:i];

    NSString *ShenSuoTitle = [array objectAtIndex:0];

    NSString *ShenSuoContent = [array objectAtIndex:1];

    UIView *listView = [[UIView alloc] initWithFrame:CGRectMake(0, totalHeight, 320, ShenSuoViewHeight)];
    [listView setBackgroundColor:[UIColor blackColor]];
    [listView setTag:[[NSString stringWithFormat:@"%d",(i+1)] intValue]];
    [self.scrollView addSubview:listView];

    totalHeight = totalHeight + 1 + ShenSuoViewHeight;

    UIView *titleView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, ShenSuoViewHeight)];
    [titleView setBackgroundColor:[UIColor whiteColor]];
    [titleView setTag:[[NSString stringWithFormat:@"%d1",i+1] intValue]];
    [listView addSubview:titleView];

    UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
    [btn setTag:[[NSString stringWithFormat:@"%d2",i+1] intValue]];
    [btn setFrame:CGRectMake(0, 0, 320, ShenSuoViewHeight)];
    [btn addTarget:self action:@selector(reSetFrame:) forControlEvents:UIControlEventTouchUpInside];
    [titleView addSubview:btn];

    UIImageView *img = [[UIImageView alloc] initWithFrame:CGRectMake(5, 12, 30, 30)];
    img.image = [UIImage imageNamed:@"list_ico.png"];
    [img setTag:[[NSString stringWithFormat:@"%d3",i+1] intValue]];
    [titleView addSubview:img];
    NSLog(@"img:%f,%f",img.frame.origin.y,img.frame.size.height);


    UILabel *labTitle = [[UILabel alloc] initWithFrame:CGRectMake(35, 15, 100, 25)];
    labTitle.textColor = [UIColor blackColor];
    labTitle.backgroundColor = [UIColor clearColor];
    labTitle.font = [UIFont boldSystemFontOfSize:15];
    labTitle.text = ShenSuoTitle;
    [titleView addSubview:labTitle];
    NSLog(@"labTitle:%f,%f",labTitle.frame.origin.y,labTitle.frame.size.height);

    //add a label for selected
    UILabel *selectedLabel = [[UILabel alloc] initWithFrame:CGRectMake(214, 14, 86, 21)];
    selectedLabel.textColor = [UIColor grayColor];
    //selectedLabel.alpha = 0.75;
    selectedLabel.backgroundColor = [UIColor clearColor];
    selectedLabel.text = @"All";
    selectedLabel.font = [UIFont boldSystemFontOfSize:15];
    [selectedLabel setTag:[[NSString stringWithFormat:@"%d5",i+1] intValue]];
    [titleView addSubview:selectedLabel];
    NSLog(@"selectedLabel:%f,%f",selectedLabel.frame.origin.y,selectedLabel.frame.size.height);

    UIView *content = [[UIView alloc] initWithFrame:CGRectMake(10, 10 + ShenSuoViewHeight, 300, 0)];
    content.backgroundColor = [UIColor grayColor];

    UILabel *testLa = [[UILabel alloc]initWithFrame:CGRectMake(0, 0, 100, 30)];
    testLa.text = @"Label";

    UIButton *testBut = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    testBut.frame = CGRectMake(0, 40, 100, 30);
    testBut.titleLabel.textColor = [UIColor greenColor];
    testBut.titleLabel.text = @"Button";

    content.tag = [[NSString stringWithFormat:@"%d4",i+1] intValue];
    [content addSubview:testLa];
    [content addSubview:testBut];

    content.clipsToBounds = YES;

    [testLa release];

    [listView addSubview:content];


    [content release];
    [labTitle release];
    [img release];
    [titleView release];
    [listView release];

处理点击使列表视图展开的代码是:

    UIView *titleView = (UIView *)[self.view viewWithTag:[[NSString stringWithFormat:@"%d1",i+1] intValue]];
    titleView.backgroundColor = [UIColor colorWithRed:0.92 green:0.92 blue:0.92 alpha:0.9];

    UIView *listView = (UIView *)[self.view viewWithTag:[[NSString stringWithFormat:@"%d",i+1] intValue]];
    listView.frame = CGRectMake(0, totalHeight, 320, ShenSuoViewHeight);
    totalHeight = totalHeight + 1 + 20 + 180 + ShenSuoViewHeight;


    UIView *content = [self.view viewWithTag:[[NSString stringWithFormat:@"%d4",i+1] intValue]];
    content.frame = CGRectMake(10, 10 + ShenSuoViewHeight, 300, 180);

    UIImageView *img = (UIImageView*)[self.view viewWithTag:[[NSString stringWithFormat:@"%d3",i+1] intValue]];
    img.image = [UIImage imageNamed:@"list_ico_d.png"];

【问题讨论】:

【参考方案1】:

我不确定我是否完全按照您的情况,并且一些代码会很好。不过,要回答您的问题,原因很可能是触摸在其他地方被拦截。也可能是您刚刚忘记将操作方法​​连接到按钮。尝试使用断点或 NSLogs 来查看哪些方法被触发,哪些没有。

【讨论】:

我粘贴了listview的两个关键点:第一个是在viewDidLoad中,第二个是在处理titleView的目标动作中被点击。实际上,无论是否连接到动作,单击的按钮都应该得到一些反应。但是这个测试却在代码接缝处没有反应。你觉得有什么问题? 我也连接了一个动作。它不响应任何点击。【参考方案2】:

非常感谢。这是由于我的错。设置listview框架的扩展栏代码错误,应该添加扩展高度。这导致视觉效果还可以,但点击无法处理。 所以这个问题解决了。

【讨论】:

以上是关于我怎么知道我点击的是哪个视图?为啥按钮没有反应?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的网页上jQuery没反应

第二次添加视图时按钮点击没有反应

为啥按钮只有在第二次点击后才起作用? (反应)

为啥这个页面在IE8点“提交”没反应

html form中 多个button的onclick()怎么处理?怎么知道点击的是哪个按钮?是要写多个onclick()函数吗?

Listview对点击的奇怪反应