El estilo UITextView se restablece después de establecer la propiedad de text

Tengo UITextView *_masterText y se restablece la fuente de la propiedad setText . Está sucediendo después de cambiar sdk 7. _masterText es IBOutlet , global y las properties se configuran en el guión gráfico. ¿Solo soy yo o este es un error SDK general?

 @interface myViewController : UIViewController { IBOutlet UITextView *_masterText; } @implementation myViewController -(void)viewWillAppear:(BOOL)animated { [_masterText setText:@"New text"]; } 

Sentado con esto durante horas, encontré el error. Si la propiedad "Seleccionable" = NO, restablecerá la fuente y el color de fuente cuando se use setText.

Entonces, active Selectable ON y el error desaparecerá.

Me encontré con el mismo problema (en Xcode 6.1) y mientras que la respuesta de John Cogan funcionó para mí, descubrí que extender la class UITextView con una categoría era una mejor solución para mi proyecto particular.

interfaz

 @interface UITextView (XcodeSetTextFormattingBugWorkaround) - (void)setSafeText:(NSString *)textValue; @end 

implementación

 @implementation UITextView (XcodeSetTextFormattingBugWorkaround) - (void)setSafeText:(NSString *)textValue { BOOL selectable = [self isSelectable]; [self setSelectable:YES]; [self setText:textValue]; [self setSelectable:selectable]; } @end 

Si desea que la vista de text sea "solo lectura", puede marcar Editable y seleccionable y desmarcar la interacción de usuario habilitada, con esto UITextView se comportaba como quería

introduzca la descripción de la imagen aquí

introduzca la descripción de la imagen aquí

Tuve este problema yo mismo y la respuesta anterior ayudó, pero agregué un contenedor a mi código de ViewController de la siguiente manera y simplemente pasé la instancia y el text de uiview para cambiar y la function de contenedor cambió el valor seleccionable, cambió el text y luego lo apago nuevamente. Útil cuando necesites que la vista de Uitext esté desactivada en todo momento de forma pnetworkingeterminada.

 /* 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]; } } 

EDIT:

La configuration de la fuente para UITextView en iOS 7 funciona para mí si primero configura el text y luego establece la fuente:

 @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 } 

En un file XIB, si agrega algún text en su UITextView y cambia la fuente o el color, funcionará.

Aquí hay una solución de subclass rápida que a menudo uso para este problema.

 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 } } } 

Este problema volvió a aparecer en Xcode 8. Así es como lo solucioné:

Cambió la extensión a:

 extension UITextView{ func setTextAvoidXcodeIssue(newText : String, selectable: Bool){ isSelectable = true text = newText isSelectable = selectable } } 

y marcó la opción seleccionable en el generador de interfaces.

No es muy elegante tener ese parámetro 'seleccionable' pero lo hará.

En iOS 8.3, la solución de configuration "seleccionable" a SÍ antes del setText, y NO después, no lo solucionó para mí.

Descubrí que necesitaba configurar "seleccionable" para SÍ en el guión gráfico, también, antes de que esto funcione.

Esto funcionó para mí:

 let font = textView.font textView.attributedText = attributedString textView.font = font 

Para mí, con el text atribuido, solo necesitaba configurar la fuente en el dictionary de attributes en lugar de configurarlo en su propio campo.

Estoy teniendo este problema para Una solución rápida de la respuesta de @Ken Steele. Extiendo el UITextView y agrego una propiedad computada.

 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; } } } 

Espero eso ayude.

Han pasado 3 años y el error aún existe en la última versión estable de Xcode (7.3). Claramente, Apple no lo arreglará en el futuro, dejando a los desarrolladores con dos opciones: dejar seleccionable y configurar UserInteractionEnabled en falso o Swizzling en el método.

Si tiene un button en su vista de text, la primera no será suficiente.

Solución sin cambio de código en 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 } } } 

C objective:

 #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 

Utilizando el método de trabajo descrito en este tema, esta extensión a UITextView proporciona una function setTextInCurrentStyle() . Basado en la solución de Alessandro Ranaldi, pero no requiere que se transfiera el valor isSelectable actual a la function.

 extension UITextView{ func setTextInCurrentStyle(_ newText: String) { let selectablePreviously = self.isSelectable isSelectable = true text = newText isSelectable = selectablePreviously } }