Есть ли способ повесить некоторый код в -sendAction: to: from: forEvent: в UIApplication? - PullRequest
1 голос
/ 07 августа 2009

как я мог это сделать? Я хочу поймать эти события и посмотреть, что происходит во всем моем приложении. Должен ли я подкласс UIApplication для этого?

UIControl вызывает этот метод, когда происходит событие. Кажется, если бы я подкласс UIControl, не было бы точки, где я мог бы ткнуть носом глубже в детали события. Я могу просто указать эти маски событий и вызвать некоторый селектор с параметром (id) отправителя, но при этом я не буду видеть, например, координаты касания или что-то в этом роде.

1 Ответ

2 голосов
/ 08 августа 2009

Вы можете использовать метод Swizzling и предоставить собственную реализацию.

@implementaion UIApplication (MyStuff)
- (BOOL)_my_sendAction:(SEL)action to:(id)target from:(id)sender forEvent:(UIEvent *)event
{
    // do your stuff here
    // ...

    // call original selector
    [self _orig_sendAction:action to:target from:sender forEvent:event];
}
@end


BOOL DTRenameSelector(Class _class, SEL _oldSelector, SEL _newSelector)
{
    Method method = nil;

    // First, look for the methods
    method = class_getInstanceMethod(_class, _oldSelector);
    if (method == nil)
        return NO;

    method->method_name = _newSelector;
    return YES;
}

Вам просто нужно поменять местами два селектора при запуске приложения:

Class UIApplicationCls = objc_getClass("UIApplication");
DTRenameSelector(UIApplicationCls, @selector(sendAction:to:from:forEvent:), @selector(_orig_sendAction:to:from:forEvent:);
DTRenameSelector(UIApplicationCls, @selector(_my_sendAction:to:from:forEvent:), @selector(sendAction:to:from:forEvent:);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...