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"];
}
Author: Juan Boero, 2013-09-27

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.

 450
Author: Bosse Nilsson,
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
 11
Author: Ken Steele,
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

Tutaj wpisz opis obrazka

Tutaj wpisz opis obrazka

 8
Author: Chuy47,
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];
    }
}
 6
Author: John Cogan,
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ł.

 2
Author: Jordan Montel,
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
        }
    }
}
 2
Author: WaltersGE1,
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.

 2
Author: Alessandro Ranaldi,
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.

 1
Author: Peter Johnson,
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
 1
Author: David Green,
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.

 0
Author: loudmouth,
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.
 0
Author: LastMove,
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
 0
Author: Mark Bourke,
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
    }
}
 0
Author: Duncan Babbage,
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