Styl UITextView jest resetowany po ustawieniu właściwości tekstowej
Mam UITextView *_masterText
i po wywołaniu metody setText
właściwość font jest resetowana.
Dzieje się to po zmianie sdk 7.
_masterText jest IBOutlet
, globalny i właściwości są ustawione w storyboard. To tylko ja czy to jest ogólne SDK bug?
@interface myViewController : UIViewController
{
IBOutlet UITextView *_masterText;
}
@implementation myViewController
-(void)viewWillAppear:(BOOL)animated
{
[_masterText setText:@"New text"];
}
13 answers
Siedząc z tym godzinami, znalazłem pluskwę. Jeśli właściwość "Selectable" = NO spowoduje Resetowanie czcionki i fontcolor, gdy zostanie użyty setText.
Więc włącz opcję Selectable i błąd zniknie.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-01 12:17:23
Natknąłem się na ten sam problem (na Xcode 6.1) i podczas gdy odpowiedź Johna Cogana zadziałała dla mnie, odkryłem, że rozszerzenie klasy UITextView o kategorię było lepszym rozwiązaniem dla mojego konkretnego projektu.
Interfejs
@interface UITextView (XcodeSetTextFormattingBugWorkaround)
- (void)setSafeText:(NSString *)textValue;
@end
Realizacja
@implementation UITextView (XcodeSetTextFormattingBugWorkaround)
- (void)setSafeText:(NSString *)textValue
{
BOOL selectable = [self isSelectable];
[self setSelectable:YES];
[self setText:textValue];
[self setSelectable:selectable];
}
@end
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:54:56
Jeśli chcesz, aby twój widok tekstowy był "tylko do odczytu", możesz zaznaczyć opcję edytowalne i wybierane i odznaczyć opcję aktywna interakcja z użytkownikiem, przy czym UITextView zachowywał się tak, jak chciałem
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-08 20:23:07
Sam miałem ten problem i powyższa odpowiedź pomogła, ale dodałem wrapper do mojego kodu ViewController w następujący sposób i po prostu przekazać instancję uiview i tekst, aby zmienić i wrapper funkcja włącza wartość wyboru, zmienia tekst, a następnie wyłącza go ponownie. Pomocne, gdy uitextview ma być domyślnie wyłączony przez cały czas.
/*
We set the text views Selectable value to YES temporarily, change text and turn it off again.
This is a known bug that if the selectable value = NO the view loses its formatting.
*/
-(void)changeTextOfUiTextViewAndKeepFormatting:(UITextView*)viewToUpdate withText:(NSString*)textValue
{
if(![viewToUpdate isSelectable]){
[viewToUpdate setSelectable:YES];
[viewToUpdate setText:textValue];
[viewToUpdate setSelectable:NO];
}else{
[viewToUpdate setText:textValue];
[viewToUpdate setSelectable:NO];
}
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-28 19:26:52
EDIT:
Ustawienie czcionki dla UITextView w iOS 7 działa dla mnie, jeśli najpierw ustawisz tekst, a następnie ustawisz czcionkę:
@property (nonatomic, weak) IBOutlet UITextView *masterText;
@implementation myViewController
-(void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
_myTextView.text = @"My Text";
_myTextView.font = [UIFont fontWithName:@"Helvetica.ttf" size:16]; // Set Font
}
W pliku XIB, jeśli dodasz tekst w widoku UITextView i zmienisz czcionkę lub kolor, który będzie działał.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-23 20:15:10
Oto szybkie rozwiązanie podklasy, którego często używam do tego problemu.
class WorkaroundTextView: UITextView {
override var text: String! {
get {
return super.text
}
set {
let originalSelectableValue = self.selectable
self.selectable = true
super.text = newValue
self.selectable = originalSelectableValue
}
}
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-20 14:39:12
Ten problem pojawił się w Xcode 8. Tak to naprawiłem:
Zmieniono rozszerzenie na:
extension UITextView{
func setTextAvoidXcodeIssue(newText : String, selectable: Bool){
isSelectable = true
text = newText
isSelectable = selectable
}
}
I zaznaczono opcję wyboru w Kreatorze interfejsów.
To nie jest zbyt eleganckie, aby mieć ten "wybierany" parametr, ale to wystarczy.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-22 15:20:32
W iOS 8.3 obejście ustawienia "selectable" na tak przed setText i nie po, nie naprawiło tego za mnie.
Znalazłem, że muszę ustawić "selectable" na tak w storyboardzie, też, zanim to zadziała.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-15 13:18:59
To mi pomogło:
let font = textView.font
textView.attributedText = attributedString
textView.font = font
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-15 14:25:12
Dla mnie z przypisanym tekstem, po prostu musiałem ustawić czcionkę w słowniku atrybutów, zamiast ustawiać ją we własnym polu.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-10 21:31:04
Mam taki problem. Szybkie, przyjazne rozwiązanie odpowiedzi Kena Steele ' a. Rozszerzam UITextView i dodaję właściwość obliczeniową.
extension UITextView {
// For older Swift version output should be NSString!
public var safeText:String!
{
set {
let selectable = self.selectable;
self.selectable = true;
self.text = newValue;
self.selectable = selectable;
}
get {
return self.text;
}
}
}
Mam nadzieję, że to pomoże.Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-23 15:48:43
Minęły 3 lata, a błąd nadal istnieje w najnowszej stabilnej wersji Xcode (7.3). Oczywiście apple nie będzie go naprawić w najbliższym czasie pozostawiając deweloperom dwie opcje: pozostawienie selectable włączone i ustawienie UserInteractionEnabled na false lub Method swizzling.
Jeśli masz przycisk na widoku tekstowym, ten pierwszy nie wystarczy.
No-code-change-requied solution in swift:
import UIKit
extension UITextView {
@nonobjc var text: String! {
get {
return performSelector(Selector("text")).takeUnretainedValue() as? String ?? ""
} set {
let originalSelectableValue = selectable
selectable = true
performSelector(Selector("setText:"), withObject: newValue)
selectable = originalSelectableValue
}
}
}
Objective-C:
#import <objc/runtime.h>
#import <UIKit/UIKit.h>
@implementation UITextView (SetTextFix)
+ (void)load {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
Class class = [self class];
SEL originalSelector = @selector(setText:);
SEL swizzledSelector = @selector(xxx_setText:);
Method originalMethod = class_getInstanceMethod(class, originalSelector);
Method swizzledMethod = class_getInstanceMethod(class, 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)xxx_setText:(NSString *)text {
BOOL originalSelectableValue = self.selectable;
self.selectable = YES;
[self xxx_setText:text];
self.selectable = originalSelectableValue;
}
@end
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-05 01:12:25
Korzystając z obejścia omówionego w tym numerze, to rozszerzenie UITextView udostępnia funkcję setTextInCurrentStyle()
. Oparty na rozwiązaniu Alessandro Ranaldiego, ale nie wymaga, aby wartość prądu była przekazywana do funkcji.
extension UITextView{
func setTextInCurrentStyle(_ newText: String) {
let selectablePreviously = self.isSelectable
isSelectable = true
text = newText
isSelectable = selectablePreviously
}
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-24 22:59:59