programing

텍스트 속성을 설정한 후 UITextView 스타일을 재설정하고 있습니다.

batch 2023. 6. 25. 18:34
반응형

텍스트 속성을 설정한 후 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는 원하는 대로 작동합니다.

enter image description here

enter image description here

이 문제와 위 답변이 도움이 되었으나 다음과 같이 내 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

반응형