为了后代:
我确信有一种使用 JS 的方法可以做到这一点并且更干净,但我设法使用方法 swizzling 实现了结果:
//Method Swizzling
UIView *webContentView = self.webView.contentView;
if(webContentView != nil)
{
//Paste:
NSError *error;
[webContentView swizzleMethod:@selector(paste:) withSelector:@selector(my_paste:) error:&error];
if(error != nil)
{
NSLog("Failed to swizzle 'paste:' into WKContentView: %@, error);
NSAssert(false, error);
}
...
}
其中 contentView 是:
- (UIView *)contentView
{
return [self subviewWithClassName:@"WKContentView"];
}
方法my_paste:
需要成为 UIResponder 的一部分(由私有 WKContentView 实现)
#pragma mark - Method Swizzling UIResponder
@interface UIResponder (WebComposerSwizzling)
- (void)my_paste:(id)sender;
#define original_paste my_paste
@end
@implementation UIResponder (WebComposerSwizzling)
- (void)my_paste:(id)sender
{
MailComposerViewController* strongComposer = sCurrentComposer;
if (strongComposer)
[strongComposer manipulatePasteboard:nil];
[self original_paste:sender];
}
@end
注意sCurrentComposer
是我的 ViewController 中的静态变量
__weak MailComposerViewController* sCurrentComposer;
各种实用程序:
UIView+SubviewSearch
import UIKit
extension UIView {
/// Find a subview corresponding to the className parameter, recursively.
@objc public func subviewWithClassName(_ className: String) -> UIView? {
if NSStringFromClass(type(of: self)) == className {
return self
} else {
for subview in subviews {
return subview.subviewWithClassName(className)
}
}
return nil
}
}
NSObject+Swizzling
import Foundation
extension NSObject {
enum NSObjectSwizzlingError: Error {
case originalSelectorNotFound
}
@objc public func swizzleMethod(_ currentSelector: Selector, withSelector newSelector: Selector) throws {
if let currentMethod = self.instanceMethod(for: currentSelector),
let newMethod = self.instanceMethod(for:newSelector) {
method_exchangeImplementations(currentMethod, newMethod)
} else {
throw NSObjectSwizzlingError.originalSelectorNotFound
}
}
@objc public func instanceMethod(for selector: Selector) -> Method? {
let classType: AnyClass! = object_getClass(self)
return class_getInstanceMethod(classType, selector)
}
}
(我对 Swift OBJ-C 混合感到抱歉)