设置文本属性后,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 } }