1

我已经阅读了响应者链上的苹果文档并且需要知道:我如何 NSLog 被点击的对象?

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

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

4

3 回答 3

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()以便使用您的自定义子类:

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
于 2012-12-12T23:05:07.703 回答
1

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

- (void)action:(id)sender {

这里 sender 代表按钮。您可以将其用作,

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

您还可以使用UITouch 委托方法进行检查。

例如:-

 -(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.
       }
于 2012-12-12T22:23:57.320 回答
0

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

直接来自 github:Introspect 是用于 iOS 的小型工具集,可帮助调试使用 UIKit 构建的用户界面。

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

于 2012-12-12T22:48:49.183 回答