2012-12-12 29 views
1

我读过的苹果文档的responder chain,并知道需要:它是怎么做我的NSLog这是在窃听对象?有什么办法可以在Objective C中使用get对象吗?

比方说,我有一个非常复杂的视图控制器与多个视图对象,当我点击一个对象(UIButton或什么是..)有没有办法知道被挖掘的特定对象? 该文档给出了一个很好的概述,但不清除覆盖的方法。

编辑: 这种情况是在测试我没有写的不同的应用程序。我需要一种快速的方法来确定所用的对象(许多应用程序都有自定义控件/对象,看起来像是一件事,但实际上是另一件事)。我希望有一些方法可以在发送到UIAppication时截获触摸事件,然后NSLog。

+1

您需要响应水龙头的方法。他们每个人都可以确定是什么导致了自来水。 (如果你需要知道事件处理结束后,你可以创建一些'id lastTapTarget'变量并保存它。) –

+0

根据文档,它说事件对象首先被发送到UIApplication,然后到窗口,然后到视图。在到达那里时是否有办法拦截这些事件?我不想开始在一个应用程序中为一堆对象编写自来水方法,我不拥有 –

+0

您如何看待这个问题?有几种方法可以回答你的问题。对于UIControl子类,您可以始终定义在进行特定触摸时调用的操作。如果你只是按照触摸事件,那么你可能需要得到沙发的坐标,并确定哪个UIView当前占用的空间。有更多的选择。真的,这取决于。请为您的情况提供更多背景。 –

回答

4

您可以覆盖-[UIApplication sendAction:to:from:forEvent]做你想要什么:

@implementation MyApplicationSubclass 

- (BOOL)sendAction:(SEL)action to:(id)target from:(id)sender forEvent:(UIEvent *)event 
{ 
    NSLog(@"Sending action %@ from sender %@ to target %@ for event %@", NSStringFromSelector(action), sender, target, event); 
    return [super sendAction:action to:target from:sender forEvent:event]; 
} 

@end 

将在UIApplication的自定义子类。然后,在main.m文件,以便使用您的自定义子类的调用更改为UIApplicationMain():使用此机制这只适用于UIControl子类,其中发送他们的行动对他们的目标

int main(int argc, char *argv[]) 
{ 
    @autoreleasepool { 
     return UIApplicationMain(argc, argv, NSStringFromClass([MyApplicationSubclass class]), NSStringFromClass([AppDelegate class])); 
    } 
} 

注意。如果您想查看所有通过应用的触摸事件,请改为使用-[UIApplication sendEvent:]。在这种情况下,将由您决定哪个对象要去接收触摸。您可以通过在您的主视图/窗口上调用-hitTest:来做到这一点,但请记住,它指出触摸着陆的视图,而不一定是哪个视图处理它(视图可以将事件转发给其他对象)。例如:

@implementation MyApplicationSubclass 

- (void)sendEvent:(UIEvent *)event 
{ 
    UIWindow *window = [self keyWindow]; 
    NSSet *touches = [event touchesForWindow:window]; 
    for (UITouch *touch in touches) { 
     UIView *touchedView = [window hitTest:[touch locationInView:window] withEvent:event]; 
     NSLog(@"Touch %@ received in view %@ for event %@", touch, touchedView, event); 
    } 

    [super sendEvent:event]; 
} 

@end 
+0

天才。谢谢!我修改我的代码只是一点点,但这应该很好:) –

1

对于按钮的动作方法通常具有PARAM,

- (void)action:(id)sender { 

这里发件人表示该按钮。您可以使用它作为,

UIButton *button = (UIButton *)sender; 
    button.hidden = YES;//use the properties of button now 

您还可以使用UITouch delegate方法检查。

对于如: -

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
     UITouch *myTouch = [[event allTouches] anyObject];// or UITouch *touch = [touches anyObject]; 

     CGPoint point = [myTouch locationInView:myViewToCheck]; 
     if (CGRectContainsPoint(myViewToCheck.bounds, point)) { 
      //Touch detected on myViewToCheck. 
     } 
+0

这是对的。我只是不认为这是他所要求的。 –

+0

好的。它不仅仅是一个按钮..有没有办法有能力记录在屏幕上点击的任何控制?这些控件可以是字面上的任何形式,包括所有形式的自定义控件。 –

+0

@HermannKlecker,是吗?对不起,我想我对这个问题感到困惑。让我再检查一次。 – iDev

0

有你有机会来看看https://github.com/domesticcatsoftware/DCIntrospect

直从GitHub:反思是针对iOS小的工具集,有助于调试与UIKit中内置的用户界面。

它有一个记录组件,可能是使用的?

+0

这对于需要的任务来说有点矫枉过正。我虽然保存了该链接。谢谢。 –

相关问题