子视图没有接收到触摸

时间:2011-05-03 17:15:40

标签: objective-c ios touches

我有一个主视图控制器,可以添加2个子视图。

- (void)viewDidLoad
{
    [self init];
    [super viewDidLoad];

    //To shrink the view to fit below the status bar.
    self.wantsFullScreenLayout = YES;

    //We start off by displaying the background Images.
    [self displayMenuSceneBackground];

    //Then we show the Menus.
    [self displayMenuSceneMenu];


}

这里我们将子视图添加到主View Controller。两个子视图都是使用界面构建器构建的视图控制器。

-(void) displayMenuSceneBackground{
    //Display the MenuSceneBackground View Controller
    MenuSceneBackground *screen = [[MenuSceneBackground alloc] init];

    [self.view addSubview:screen.view];
    [screen release];
}

-(void) displayMenuSceneMenu{
    //Display the MenuSceneMenu View Controller
    MenuSceneMenu *screen = [[MenuSceneMenu alloc] init];

    [self.view addSubview:screen.view];
    [screen release];
}

两个子视图都能正确显示,即使MenuSceneBackground视图控制器中的某些动画也能正常工作,但这些子视图都不会接收到触摸事件。

它们都实现了touchesBegan,但只有主视图控制器接收它们。

我尝试将主视图控制器userInteraction设置为NO,而不是实现touchesBegan方法,但这只会使触摸被忽略。

两个子视图都显示在整个屏幕尺寸上。

我确实读过类似的问题,但回复没有任何帮助。

我在子视图中有这个

- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    [super touchesBegan:touches withEvent:event];

    NSLog(@"testing MenuSceneMenu");
    [self clicked_testing_alert];    //This is a UIAlertView for debugging
    return;
}

感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

请注意,UIViewController与UIView不同,因此不接收touchesBegan-events。 (您在视图控制器中添加了touchesBegan而不是在视图中...)。

解决方案:感谢Simon Goldeen,我发现在一个演示项目中,touchesBegan会被调用。但是,在我的生产项目中,它没有。事情就是这样:(正如Apple建议的那样)你和我正在使用- (void)release;来减少内存使用量。 这会导致touchesBegan不被调用。 Simon不使用release,所以在他的情况下,他们会被调用。

答案 1 :(得分:0)

我很确定问题出在你拨打[super touchesBegan:touches withEvent:event];

从该方法的UIResponder文档:

  

此方法的默认实现不执行任何操作。但是,UIResponder的UIKit子类,特别是UIView,会立即将消息转发给响应者链。

因此,UIViewController的默认行为是传递响应者链。由于这不是您想要做的事情(至少不是立即),您应该从代码中删除该行,或者在确定您不需要或想要响应当前视图中的触摸后包含该行