Метод Swizzling для UIView

Я следую " Этому" руководству. захватить UIView трогает началось, но когда я NSLog() прикосновения начались в UIViewController что это для, это не стреляет, но действительно стреляет в методе swizzled. Есть ли способ, которым я могу запустить его в обоих?

1 ответ

При переключении методов, вы в основном говорите среде выполнения Objective C, чтобы она изменила свое внутреннее отображение селектора метода (как вы его называете) на реализацию метода (что он делает при вызове). Главное, что нужно понять, это то, что на самом деле это не одно и то же в Objective-C (хотя мы обычно не думаем об этом различии при кодировании). Если вы можете понять концепцию сопоставления селекторов, разбираться в простейших играх легко.

Типичным шаблоном является замена существующего метода (обычно класса, который вы не контролируете) на собственный настраиваемый метод с той же сигнатурой путем обмена их селекторами так, чтобы ваш селектор указывал на существующую реализацию, а существующий селектор указывает на вашу реализацию.,

Сделав это, вы можете вызвать исходную реализацию, вызвав селектор вашего пользовательского метода.

Внешнему наблюдателю это, кажется, создает петлю повторного входа:

- (void)swizzled_touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    // custom logic

    [self swizzled_touchesBegan:touches withEvent:event]; // <-- this actually calls the original implementation

    // custom logic
}

… Но поскольку вы поменяли местами селекторы, селектор, который выглядит рекурсивным, фактически указывает на исходную реализацию. Именно поэтому звонит [view touchesBegan: withEvent:] заканчивает тем, что вызвал ваш метод swizzled в первую очередь.

Аккуратно а?

Другие вопросы по тегам