Skip to content

Instantly share code, notes, and snippets.

@bnickel
Created August 26, 2016 19:39
Show Gist options
  • Save bnickel/b6ef57b166506eb71487899190c5b383 to your computer and use it in GitHub Desktop.
Save bnickel/b6ef57b166506eb71487899190c5b383 to your computer and use it in GitHub Desktop.
#import <objc/runtime.h>
@interface UIViewController (SEUIIntentTarget_SWIZZLE)
- (UIResponder *)SEUI_originalNextResponder;
@end
@interface SEUIIntentTarget ()
@property (nonatomic, weak, nullable) UIViewController *owningViewController;
@end
@implementation SEUIIntentTarget
- (UIResponder *)nextResponder
{
return [self.owningViewController SEUI_originalNextResponder];
}
@end
@implementation UIViewController (SEUIIntentTarget)
- (SEUIIntentTarget *)SEUI_intentTargetIfLoaded
{
return objc_getAssociatedObject(self, @selector(SEUI_intentTarget));
}
- (SEUIIntentTarget *)SEUI_intentTarget
{
return [self SEUI_intentTargetIfLoaded] ?: ({
SEUIIntentTarget *target = [[SEUIIntentTarget alloc] init];
target.owningViewController = self;
objc_setAssociatedObject(self, @selector(SEUI_intentTarget), target, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
target;
});
}
@end
@implementation UIViewController (SEUIIntentTarget_SWIZZLE)
+ (void)load
{
SEUISwizzle(self, @selector(nextResponder), @selector(SEUIIntentTarget_nextResponder));
}
- (UIResponder *)SEUIIntentTarget_nextResponder
{
return [self SEUI_intentTargetIfLoaded] ?: [self SEUIIntentTarget_nextResponder];
}
- (UIResponder *)SEUI_originalNextResponder
{
return [self SEUIIntentTarget_nextResponder];
}
@end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment