miałem ten problem z iOS/UIWebView
, który nie implementuje makeFirstResponder
w UIWindow
ani webViewDidEndEditing
lub shouldBeginEditingInDOMRange
. Jednak dzięki Swizzlingowi udało mi się stworzyć kategorię pomocników, która pozwala na pobranie aktualnej pierwszej odpowiedzi, a także wysłanie powiadomienia za każdym razem, gdy zmienia się pierwszy reagujący. Naprawdę frustrujące, jak to wszystko powinno być publicznym API, ale nie jest, ponieważ swizzle nie jest zwykle pierwszym goto, ale działało to wystarczająco dobrze.
pierwsze, konfiguracja Twój nagłówek kategoria:
@interface UIResponder (Swizzle)
+ (UIResponder *)currentFirstResponder;
- (BOOL)customBecomeFirstResponder;
@end
Następnie realizacja Kategoria
@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
Wreszcie, przy użyciu pomocnika jak JR Swizzle, zamienić klas.
#import "JRSwizzle.h"
- (void)applicationLoaded {
if(![UIResponder jr_swizzleMethod:@selector(becomeFirstResponder) withMethod:@selector(customBecomeFirstResponder) error:&error]) {
NSLog(@"Error swizzling - %@",error);
}
}
Myślałem, że się podzielę. Prawidłowy w App Store, ponieważ nie korzysta z prywatnego interfejsu API, a Apple ostrzega przed zawikłaniem klas bazowych, ale nie ma w tym przeszkód.
Dokładnie taki sam problem, czy kiedykolwiek znalazłeś rozwiązanie? – Kappe