Стиль UITextView сбрасывается после установки свойства text
у меня есть UITextView *_masterText
и после вызова метода setText
шрифт свойства сбрасывается.
Это происходит после того, как я меняю sdk 7.
_masterText составляет IBOutlet
глобальные и свойства устанавливаются в раскадровке. Это только я или это общая ошибка SDK?
@interface myViewController : UIViewController
{
IBOutlet UITextView *_masterText;
}
@implementation myViewController
-(void)viewWillAppear:(BOOL)animated
{
[_masterText setText:@"New text"];
}
13 ответов:
сидя с этим в течение нескольких часов, я нашел ошибку. Если свойство "Selectable" = NO, оно сбросит шрифт и цвет шрифта при использовании setText.
поэтому включите выбор, и ошибка исчезнет.
я столкнулся с той же проблемой (в Xcode 6.1) и в то время как ответ Джона Когана работал для меня, я обнаружил, что расширение класса UITextView с категорией было лучшим решением для моего конкретного проекта.
интерфейс
@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
У меня была эта проблема, и приведенный выше ответ помог, но я добавил оболочку в свой код ViewController следующим образом и просто передал экземпляр uiview и текст для изменения, а функция оболочки переключает выбираемое значение, изменяет текст, а затем снова отключает его. Полезно, когда вам нужно, чтобы uitextview был выключен в любое время по умолчанию.
/* 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:
настройка шрифта для UITextView в iOS 7 работает для меня, если сначала вы установите текст, а затем установите шрифт:
@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 и измените шрифт или цвет, он будет работать.
вот быстрое решение подкласса, которое я часто использую для этой проблемы.
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 } }
и проверил возможность выбора в Построителе интерфейса.
Это не очень элегантно, чтобы иметь, что дискретный параметр, но он будет делать.
в iOS 8.3 обходной путь установки "выбирается" в YES до setText и нет после, не исправил его для меня.
Я обнаружил, что мне нужно установить "выбираемый" в да в раскадровке, прежде чем это сработает.
это сработало для меня:
let font = textView.font textView.attributedText = attributedString textView.font = font
для меня с атрибутированным текстом мне просто нужно было установить шрифт в словаре атрибутов, а не устанавливать его в своем собственном поле.
У меня есть эта проблема. Быстрое и удобное решение ответа @Ken Steele. Я расширяю 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). Очевидно, что apple не будет исправлять его в ближайшее время, оставляя разработчикам два варианта: оставляя выбор и устанавливая UserInteractionEnabled на false или метод swizzling.
Если у вас есть кнопка на вашем textView первый не будет достаточно.
No-code-change-requied решение в 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:
#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