Nie sądzę, że smartQuotesType
i smartQuotesType
to dobre praktyki w niektórych językach.
ustawić te właściwości dla każdego wejścia tekstowych w naszej aplikacji:
if (@available(iOS 11.0, *)) {
textView.smartDashesType = UITextSmartDashesTypeNo;
textView.smartQuotesType = UITextSmartQuotesTypeNo;
textView.smartInsertDeleteType = UITextSmartInsertDeleteTypeNo;
} else {
// Fallback on earlier versions
}
Tworzenie kategorię, aby wyłączyć te funkcje „smart” sprawia, że nie ma sensu (Bug):
- (UITextSmartDashesType)smartDashesType {
return UITextSmartDashesTypeNo;
}
- (UITextSmartQuotesType)smartQuotesType {
return UITextSmartQuotesTypeNo;
}
- (UITextSmartInsertDeleteType)smartInsertDeleteType {
return UITextSmartInsertDeleteTypeNo;
}
Więc próbowałem wyłącz te funkcje na stałe za pomocą metody swizzling:
#import <objc/runtime.h>
@implementation DisableFuckingSmartPunctuation
+ (void)load {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
Class class = [objc_getClass("UITextInputController") class];
Class myClass = [self class];
SEL originalSelector = @selector(checkSmartPunctuationForWordInRange:);
SEL swizzledSelector = @selector(checkSmartPunctuationForWordInRange:);
Method originalMethod = class_getInstanceMethod(class, originalSelector);
Method swizzledMethod = class_getInstanceMethod(myClass, swizzledSelector);
BOOL didAddMethod =
class_addMethod(class,
originalSelector,
method_getImplementation(swizzledMethod),
method_getTypeEncoding(swizzledMethod));
if (didAddMethod) {
class_replaceMethod(class,
swizzledSelector,
method_getImplementation(originalMethod),
method_getTypeEncoding(originalMethod));
} else {
method_exchangeImplementations(originalMethod, swizzledMethod);
}
});
}
- (void)checkSmartPunctuationForWordInRange:(id)arg1 {
}
@end
Hakowanie prywatnych metod zawsze w orki lubią urok ...
Niezły dodatek. Tylko wyjaśnienie: 'smartQuotesType' jest dostępne tylko w systemie iOS11. [Apple docs] (https://developer.apple.com/documentation/uikit/uitextinputtraits/2865931-smartquotestype) –
No tak, ale "iOS 11" to dosłownie pierwsze dwa słowa w tytule pytania i pytanie, więc uważam, że było całkiem jasne. – Paulw11
To prawda, ale możesz napotkać ten problem, uruchamiając aplikacje iOS10 na urządzeniach z iOS11. Możesz natknąć się na ** inteligentne znaki interpunkcyjne ** w iOS11, których nie można się pozbyć, chyba że Twój projekt jest kompilowany w iOS11. –