我的自定义UIView dos没有收到触动

时间:2013-04-21 14:17:11

标签: ios uiview nib

使用IB,我创建了一个包含几个按钮的小子视图。我的控制器从xib文件中读取小视图,并将其作为子视图添加到主视图中。加载好,我可以看到子视图及其所有按钮。据我所知,它还连接到控制器中的IBOutlets和IBActions。

然而,当我按下按钮时没有任何反应!事实上,当我按下按钮时,会调用超级视图的touchesBegan! 超级视图还包含一个“普通按钮”(即我的子视图的兄弟),该按钮工作正常!问题:为什么子视图上的按钮不起作用?

-(void) loadMultibutt{
    self.buttErase = nil; // test if the outlet connects
    NSArray *arr = [[NSBundle mainBundle]
                    loadNibNamed:@"multibutt_ipad" owner:self options:nil];

    UIView *viewButts = [arr objectAtIndex:0];
    ViewWorkbench* vw = (ViewWorkbench*) self.view;
    [vw addMultibuttView:viewButts];

    // now, buttErase != nil.
    NSSet *setTest = [self.buttErase allTargets];
    NSLog(@"setTest = %@", setTest); // This works!
}

1 个答案:

答案 0 :(得分:7)

根据您的回复,我感到安全的结论是您的问题是您的按钮的父视图不包含其交互区域中的按钮。您仍然可以看到它们,因为您没有剪切子视图,但仍然无法与它们进行交互。有两种方法可以解决您的问题

a)(推荐)将按钮放在适当的位置,使它们位于父视图的可见(和交互区域)内

b)覆盖父视图的hitTest选择器,以便跟踪其子视图中的所有触摸,包括其边界之外的所有触摸。为此,您必须创建UIView的子类并实现以下内容:

-(UIView *) hitTest:(CGPoint)point withEvent:(UIEvent *)event{
UIView* result = [super hitTest:point withEvent:event];
if (result)
    return result;
for (UIView* sub in [self.subviews reverseObjectEnumerator]) {
    CGPoint pt = [self convertPoint:point toView:sub];
    result = [sub hitTest:pt withEvent:event];
    if (result)
        return result;
}
return nil;

}