我怎么知道我点击的是哪个视图?为啥按钮没有反应?
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框架的扩展栏代码错误,应该添加扩展高度。这导致视觉效果还可以,但点击无法处理。 所以这个问题解决了。
【讨论】:
以上是关于我怎么知道我点击的是哪个视图?为啥按钮没有反应?的主要内容,如果未能解决你的问题,请参考以下文章
html form中 多个button的onclick()怎么处理?怎么知道点击的是哪个按钮?是要写多个onclick()函数吗?