텍스트 속성을 설정한 후 UITextView 스타일을 재설정하고 있습니다.
있습니다UITextView *_masterText
및 애프터콜 방식setText
속성 글꼴을 재설정하는 중입니다.sdk 7을 변경한 후에 발생합니다. _master텍스트는IBOutlet
전역 및 속성은 스토리보드에 설정됩니다.나만 그런 거야 아니면 이게 일반 SDK 버그야?
@interface myViewController : UIViewController
{
IBOutlet UITextView *_masterText;
}
@implementation myViewController
-(void)viewWillAppear:(BOOL)animated
{
[_masterText setText:@"New text"];
}
몇 시간 동안 이것을 가지고 앉아있다가 벌레를 발견했습니다.속성 "선택 가능" = "아니오"인 경우 setText가 사용될 때 글꼴과 글꼴 색상이 재설정됩니다.
선택 가능을 설정하면 버그가 사라집니다.
Xcode 6.1에서 동일한 문제에 부딪혔고 John Cogan의 답변이 효과적이었지만 범주가 있는 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
텍스트 보기를 "읽기 전용"으로 하려면 편집 가능 및 선택 가능을 선택하고 사용자 상호 작용 사용을 선택 취소하면 됩니다. 이 경우 UITextView는 원하는 대로 작동합니다.
이 문제와 위 답변이 도움이 되었으나 다음과 같이 내 ViewController 코드에 래퍼를 추가하고 변경할 uview 인스턴스와 텍스트를 전달하면 래퍼 기능이 선택 가능한 값을 켜고 텍스트를 변경한 다음 다시 끕니다.기본적으로 사용자 정의 텍스트 보기를 항상 해제해야 할 경우 유용합니다.
/*
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 파일에서 UI 텍스트 보기에 텍스트를 추가하고 글꼴이나 색을 변경하면 작동합니다.
여기 이 문제에 자주 사용하는 빠른 하위 클래스 솔루션이 있습니다.
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에서는 setText 이전에는 "선택 가능"을 "예"로 설정하고 이후에는 "아니오"로 설정하는 해결 방법이 해결되지 않았습니다.
스토리보드에서도 "선택 가능"을 "예"로 설정해야 했습니다.
이것은 저에게 효과가 있었습니다.
let font = textView.font
textView.attributedText = attributedString
textView.font = font
속성이 있는 텍스트를 사용하는 저의 경우 글꼴을 자체 필드에 설정하기보다는 속성 사전에서 설정하기만 하면 되었습니다.
저는 이 문제를 겪고 있습니다.@Ken Steel의 답변에 대한 신속하고 친근한 해결책.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)에는 버그가 여전히 존재합니다.분명히 애플은 조만간 이 문제를 수정하지 않을 것입니다. 개발자들에게 선택 가능한 상태를 유지하고 User Interaction Enabled를 false로 설정하거나 Method swizzling으로 설정하는 두 가지 옵션을 남겨둡니다.
텍스트에 단추가 있는 경우 전자 보기로는 충분하지 않습니다.
코드 변경이 필요 없는 신속한 솔루션:
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
호에서 방법을 된 이 은 "UITtextView"를합니다.setTextInCurrentStyle()
例기. 라날디의 으로 하지만 .알레산드로 라날디의 솔루션을 기반으로 하지만 기능에 전달할 전류는 선택 가능한 값입니다.
extension UITextView{
func setTextInCurrentStyle(_ newText: String) {
let selectablePreviously = self.isSelectable
isSelectable = true
text = newText
isSelectable = selectablePreviously
}
}
언급URL : https://stackoverflow.com/questions/19049917/uitextview-style-is-being-reset-after-setting-text-property
'programing' 카테고리의 다른 글
PLS-00302가 표시되는 이유: 구성 요소가 있을 때 선언되어야 합니까? (0) | 2023.06.25 |
---|---|
$lookup Aggregation 연산자와 함께 샤딩을 사용하는 MongoDB (0) | 2023.06.25 |
문자열에서 수학식 평가 (0) | 2023.06.25 |
MacOS에서 아나콘다를 완전히 제거하는 방법 (0) | 2023.06.25 |
SQL 쿼리에 대한 기본 스키마 설정 (0) | 2023.06.25 |