设置文本属性后,UITextView样式正在重置

我有UITextView *_masterText和调用方法setText属性字体正在重置。 这是发生在我更改SDK 7后。_masterText是IBOutlet ,全局和属性设置在故事板。 这只是我或这是一般的SDK错误?

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

坐了几个小时,我发现了这个bug。 如果属性“Selectable”= NO,则使用setText时将重置字体和fontcolor。

所以把Selectable打开,错误消失了。

我遇到了同样的问题(在Xcode 6.1上),而John Cogan的答案为我工作,我发现扩展UITextView类与一个类别是一个更好的解决scheme,我的特定项目。

接口

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

履行

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

如果你希望你的文本视图是“只读”,你可以检查可编辑和可select,并取消选中用户交互启用,与此UITextView行事正如我想

在这里输入图像说明

在这里输入图像说明

有这个问题我自己和上面的答案帮助,但我添加了一个包装到我的ViewController代码如下,只是通过uiview实例和文本来改变和包装function切换select的值,改变文本,然后再次closures。 有用的时候,你需要uitextview在任何时候默认closures。

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

编辑:

在iOS 7中为UITextView设置字体适用于我,如果首先设置文本,然后设置字体:

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

在XIB文件上,如果在UITextView中添加一些文本并更改字体或颜色,它将起作用。

这是我经常用来解决这个问题的一个快速子类解决scheme。

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

这个问题在Xcode 8中重新出现了。我是这样解决的:

将扩展名更改为:

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

并在Interface Builder中检查了Selectable选项。

拥有这个“可选”参数并不是很优雅,但它可以。

在iOS 8.3中,在setText之前将“selectable”设置为YES,之后没有为我修复的解决方法。

我发现我也需要在故事板中将“可选”设置为“是”,然后才能正常工作。

这对我工作:

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

对于具有属性的文本,我只需要在属性字典中设置字体,而不是将其设置在自己的字段中。

我有这个问题。 @Ken Steele的答案答案的快速友好的解决scheme。 我扩展UITextView并添加一个计算属性。

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

希望能帮助到你。

已经有3年了,这个错误在最新的Xcode(7.3)稳定版本中依然存在。 很明显,苹果不会很快修复它,留下开发人员有两个select:离开select和设置UserInteractionEnabled为false或方法swizzling。

如果你的textView上有一个button,前者是不够的。

swift中无需更改代码的解决scheme:

 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 

使用本期讨论的解决方法,UITextView的这个扩展提供了一个setTextInCurrentStyle()函数。 基于Alessandro Ranaldi的解决scheme,但不要求将当前的isSelectable值传递给函数。

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