有没有办法在Objective C中使用get对象?

时间:2012-12-12 22:19:31

标签: objective-c ios cocoa-touch

我已经阅读了responder chain上的苹果文档并且需要知道:我如何处理NSLog中被攻击的对象?

假设我有一个非常复杂的视图控制器,它有多个视图对象,当我点击一个对象(UIButton或者其他什么......)有没有办法知道被挖掘的特定对象? 文档提供了很好的概述,但是没有明确要覆盖的方法。

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

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

您是否有机会查看https://github.com/domesticcatsoftware/DCIntrospect

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

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