iOS / でこの問題が発生UIWebView
しmakeFirstResponder
ましUIWindow
た。しかし、Swizzling を使用することで、現在のファーストレスポンダーを取得し、ファーストレスポンダーが変わるたびに通知を投稿できるヘルパー カテゴリを作成することができました。通常、swizzle は最初の goto ではないため、これがすべてパブリック API であるべきかどうかは本当にイライラしますが、これは十分に機能しました。webViewDidEndEditing
shouldBeginEditingInDOMRange
まず、カテゴリ ヘッダーを設定します。
@interface UIResponder (Swizzle)
+ (UIResponder *)currentFirstResponder;
- (BOOL)customBecomeFirstResponder;
@end
次に、カテゴリの実装
@implementation UIResponder (Swizzle)
// It's insanity that there is no better way to get a notification when the first responder changes, but there it is.
static UIResponder *sCurrentFirstResponder;
+ (UIResponder *)currentFirstResponder {
return sCurrentFirstResponder;
}
- (BOOL)customBecomeFirstResponder {
NSMutableDictionary *userInfo = [NSMutableDictionary dictionaryWithCapacity:2];
if(sCurrentFirstResponder) {
[userInfo setObject:sCurrentFirstResponder forKey:NSKeyValueChangeOldKey];
}
sCurrentFirstResponder = self;
if(sCurrentFirstResponder) {
[userInfo setObject:sCurrentFirstResponder forKey:NSKeyValueChangeNewKey];
}
[[NSNotificationCenter defaultCenter] postNotificationName:kFirstResponderDidChangeNotification
object:nil
userInfo:userInfo];
return [self customBecomeFirstResponder];
}
@end
最後に、JR Swizzleなどのヘルパーを使用して、クラスを交換します。
#import "JRSwizzle.h"
- (void)applicationLoaded {
if(![UIResponder jr_swizzleMethod:@selector(becomeFirstResponder) withMethod:@selector(customBecomeFirstResponder) error:&error]) {
NSLog(@"Error swizzling - %@",error);
}
}
共有したいと思いました。プライベート API を使用しないため、App Store で有効です。また、Apple は基本クラスのスウィズリングに対して警告していますが、そうすることに反対する布告はありません。