Objective c 有没有办法获取在目标C中被点击的对象?

Objective c 有没有办法获取在目标C中被点击的对象?,objective-c,ios,cocoa-touch,Objective C,Ios,Cocoa Touch,我已经阅读了上的苹果文档,需要知道:我如何记录被点击的对象 假设我有一个非常复杂的视图控制器,它有多个视图对象,当我点击一个对象(UIButton或其他任何东西)时,有没有办法知道被点击的特定对象? 这些文档提供了一个很好的概述,但没有明确的覆盖方法 编辑: 情况是在测试我没有编写的不同应用程序。我需要一种快速的方法来确定被点击的对象(因为许多应用程序都有自定义控件/对象,看起来像一件事,但实际上是另一件事)。我希望有某种方法可以在触摸事件发送到UIAppification时截获它,然后记录它。

我已经阅读了上的苹果文档,需要知道:我如何记录被点击的对象

假设我有一个非常复杂的视图控制器,它有多个视图对象,当我点击一个对象(UIButton或其他任何东西)时,有没有办法知道被点击的特定对象? 这些文档提供了一个很好的概述,但没有明确的覆盖方法

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

对于按钮,操作方法通常具有该参数

- (void)action:(id)sender {
这里sender代表按钮。你可以把它当作

   UIButton *button = (UIButton *)sender;
   button.hidden = YES;//use the properties of button now
您还可以使用这些方法进行检查

例如:

 -(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.
       }

对于按钮,操作方法通常具有该参数

- (void)action:(id)sender {
这里sender代表按钮。你可以把它当作

   UIButton *button = (UIButton *)sender;
   button.hidden = YES;//use the properties of button now
您还可以使用这些方法进行检查

例如:

 -(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.
       }

你有机会看一看吗

直接来自github:Introspect是一组用于iOS的小工具,有助于调试使用UIKit构建的用户界面


它有一个可能有用的日志组件?

您是否有机会看一下

直接来自github:Introspect是一组用于iOS的小工具,有助于调试使用UIKit构建的用户界面


它有一个可能有用的日志组件?

您可以覆盖
-[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()
,以便使用自定义子类:

int main(int argc, char *argv[])
{
    @autoreleasepool {
        return UIApplicationMain(argc, argv, NSStringFromClass([MyApplicationSubclass class]), NSStringFromClass([AppDelegate class]));
    }
}
请注意,这仅适用于UIControl子类,这些子类使用此机制将其操作发送到其目标。如果您想查看应用程序中的所有触摸事件,请改为覆盖
-[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

您可以重写
-[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()
,以便使用自定义子类:

int main(int argc, char *argv[])
{
    @autoreleasepool {
        return UIApplicationMain(argc, argv, NSStringFromClass([MyApplicationSubclass class]), NSStringFromClass([AppDelegate class]));
    }
}
请注意,这仅适用于UIControl子类,这些子类使用此机制将其操作发送到其目标。如果您想查看应用程序中的所有触摸事件,请改为覆盖
-[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


没错。我只是不认为这是他所要求的。这不仅仅是一个按钮。。有没有一种方法能够记录屏幕上点击的任何控件?控件可以是任何东西,包括所有形式的自定义控件。@HermannKlecker,是吗?对不起,那个么我想我被这个问题弄糊涂了。让我再检查一下。我也被这个问题弄糊涂了:)没错。我只是不认为这是他所要求的。这不仅仅是一个按钮。。有没有一种方法能够记录屏幕上点击的任何控件?控件可以是任何东西,包括所有形式的自定义控件。@HermannKlecker,是吗?对不起,那个么我想我被这个问题弄糊涂了。让我再检查一次。我也被这个问题弄糊涂了:)你需要对点击做出反应的方法。它们中的每一个都可以确定是什么导致了它的抽头。(如果您需要知道事件处理结束后,您可以创建某种类型的
id lastTapTarget
变量并保存它。)根据文档,它表示事件对象首先发送到UIApplication,然后发送到窗口,然后发送到视图。有没有办法在到达那里时拦截这些事件?我不想开始为一个我不拥有的应用程序中的一堆对象编写点击方法,你怎么能注意到有一个点击呢?有几种方法可以回答你的问题。对于UIControl子类,您始终可以定义在进行特定触摸时调用的操作。如果您只是跟踪触摸事件,那么您可能需要获取沙发的坐标,并确定哪个UIView当前占用了相关空间。还有更多的选择。真的,这要看情况。请为您的情况提供更多的背景信息。@user76859403-如果点击的目的是让用户调用某种应用程序行为,那么无论您想记录什么,您都需要这些方法。(你所说的“我不拥有的应用程序中的对象”是什么意思?)我刚刚更新了“你需要响应点击的方法”这个问题。它们中的每一个都可以确定是什么导致了它的抽头。(如果您需要知道事件处理结束后,您可以创建某种类型的
id lastTapTarget
变量并保存它。)根据文档,它表示事件对象首先发送到UIApplication,然后发送到窗口,然后发送到视图。有没有办法在到达那里时拦截这些事件?我不想开始为一个我不拥有的应用程序中的一堆对象编写点击方法,你怎么能注意到有一个点击呢?有几种方法可以回答这个问题