टेक्स्ट प्रॉपर्टी सेट करने के बाद UITextView स्टाइल को रीसेट किया जा रहा है


145

मेरे पास है UITextView *_masterTextऔर कॉल विधि के बाद setTextसंपत्ति फ़ॉन्ट रीसेट किया जा रहा है। यह होने के बाद मैं बदल रहा हूँ एसडीके 7. _मास्टरटेक्स्ट IBOutlet, वैश्विक और गुण स्टोरीबोर्ड में सेट हैं। यह केवल मैं या यह सामान्य एसडीके बग है?

@interface myViewController : UIViewController
{
  IBOutlet UITextView *_masterText;
}

@implementation myViewController

-(void)viewWillAppear:(BOOL)animated
{
    [_masterText setText:@"New text"];
}

जवाबों:


450

घंटों तक इसी के साथ बैठकर मुझे बग मिला। यदि गुण "Selectable" = NO यह सेटटैक् ट का उपयोग करने पर फ़ॉन्ट और फॉन्टोलर को रीसेट कर देगा।

इसलिए Selectable ON करें और बग चला गया है।


15
: यह मेरे लिए बुला setText से पहले Xcode में 5. मेरे वैकल्पिक हल अस्थायी रूप से सेट चयन करने के लिए है भी होता है = हाँ
Rollin_s

8
वाह, क्या हास्यास्पद बग है। अंतर्दृष्टि के लिए धन्यवाद!
मीका

3
बहुत बहुत धन्यवाद !
मगुरिज़ियो

6
6.4 में अभी भी यह मुद्दा है
रंडमस्क ज़ूल

4
यह iOS 10 में तय किया गया लगता है, अगर आपका अभी भी iOS 9 या उससे नीचे का लक्ष्यीकरण आपको वर्कअराउंड करने की आवश्यकता होगी।
user1184205

11

मैं एक ही मुद्दे पर (एक्सकोड 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

1
और स्विफ्ट में:extension UITextView { func setSafeText(text: String){ let originalSelectable = selectable selectable = true self.text = text selectable = originalSelectable } }
थोड़ा

8

यदि आप चाहते हैं कि आपका पाठ दृश्य "केवल पढ़ने के लिए" हो तो आप संपादन योग्य और चयन योग्य और उपयोगकर्ता सहभागिता को अनचेक कर सकते हैं, इसके साथ ही UITextView जैसा मैं चाहता था वह व्यवहार कर रहा था

यहाँ छवि विवरण दर्ज करें

यहाँ छवि विवरण दर्ज करें


3
यह सतह पर एक व्यवहार्य समाधान लगता है, लेकिन अंततः UITextView के लिए एक अच्छा विकल्प नहीं है। आम तौर पर आप एक UITextView चुनते हैं क्योंकि आपको एक स्क्रॉल पाठ क्षेत्र की आवश्यकता होती है। उपयोगकर्ता सहभागिता को अक्षम करने से स्क्रॉल दृश्य भी अक्षम हो जाता है। मेरे लिए एक UITextView का उपयोग करने का विकल्प था क्योंकि मेरे पास एक ऐसा क्षेत्र था जो उस क्षेत्र में फिट होने की तुलना में अधिक पाठ रखने की आवश्यकता थी, और स्क्रॉल करने में सक्षम हो।
jhelzer

6

इस मुद्दे को स्वयं और ऊपर दिए गए उत्तर ने मदद की, लेकिन मैंने निम्न के रूप में अपने ViewController कोड में एक आवरण जोड़ा और सिर्फ बदलने के लिए uiview उदाहरण और पाठ को पास किया और आवरण फ़ंक्शन का चयन करता है, पाठ को बदलता है और फिर इसे फिर से चालू करता है। डिफ़ॉल्ट रूप से हर समय बंद होने के लिए आवश्यक है जब आप मददगार हों।

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

1
UITextView को subclass करना बेहतर होगा और setText को ओवरराइड करें और ऐप में अपने
सबक्लास का

2

संपादित करें:

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 में कुछ पाठ जोड़ते हैं और फ़ॉन्ट या रंग को बदल देंगे।


हम्म .. मैं संपत्ति का उपयोग करता हूं लेकिन कोई बदलाव नहीं।
बलोएज

भूल गए [सुपर viewWillAppear: एनिमेटेड];
जॉर्डन मोंटेल

मैं इसके बारे में भूल गया, लेकिन इसका कोई असर नहीं हुआ :(
बलोएज

अपने XCode को साफ और पुनः आरंभ करें क्योंकि यह मेरे लिए "_myTextView.font ..." लाइन के बिना ठीक है, भले ही मैं XIB फ़ाइल से फ़ॉन्ट बदलूं
जॉर्डन मोंटेल

साफ, अभिकर्मक और कोई प्रभाव नहीं। प्रोजेक्ट> iOS डिपॉजिट टारगेट 7.0, बेस एसडीके 7.0 समान सेटिंग्स को टार्गेट में।
बलोएज

2

इस समस्या के लिए मैं अक्सर एक त्वरित उपवर्ग समाधान का उपयोग करता हूं।

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

2

यह मुद्दा Xcode 8 में फिर से आया है। यह है कि मैंने इसे कैसे तय किया:

एक्सटेंशन को इसमें बदल दिया गया है:

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

और इंटरफ़ेस बिल्डर में चयन करने योग्य विकल्प की जाँच की।

यह बहुत सुंदर नहीं है कि 'चयन' पैरामीटर है, लेकिन यह होगा।


1

IOS 8.3 में, सेटटेक्स्ट से पहले YES में "सेलेबल" सेट करने का वर्कअराउंड और उसके बाद NO, मेरे लिए इसे ठीक नहीं किया।

मैंने पाया कि मुझे स्टोरीबोर्ड में हां में "चयन करने योग्य" सेट करने की आवश्यकता है, इससे पहले कि यह काम करेगा।


आपने मेरा दिन बचाया, मेरा मानना ​​है कि यह कोकोआटोक में सिर्फ एक और हास्यास्पद बग है
क्रिस


0

मेरे लिए जिम्मेदार पाठ के साथ, मुझे केवल इसे अपने क्षेत्र में स्थापित करने के बजाय गुण शब्दकोश में फ़ॉन्ट सेट करने की आवश्यकता है।


0

मुझे यह समस्या हो रही है। @ स्टेन स्टील के उत्तर के उत्तर का एक स्वादिष्ठ-अनुकूल समाधान। मैं 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;
        }
    }
}

आशा करता हूँ की ये काम करेगा।


0

इसके 3 साल हो गए हैं और बग अभी भी Xcode (7.3) के नवीनतम स्थिर संस्करण में मौजूद है। स्पष्ट रूप से ऐप्पल वॉन्ट इसे किसी भी समय जल्द ही तय कर सकता है ताकि डेवलपर्स को दो विकल्पों के साथ छोड़ दिया जा सके: चयन करने योग्य छोड़ने और UserInteraction को अक्षम करने के लिए सेट करना।

यदि आपके पास अपने textView पर एक बटन है तो पूर्व पर्याप्त नहीं होगा।

स्विफ्ट में कोई कोड-परिवर्तन-आवश्यक समाधान:

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

उद्देश्य सी:

#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

0

इस मुद्दे पर चर्चा किए गए कार्य-का उपयोग करते हुए, UITextView के लिए यह एक्सटेंशन एक setTextInCurrentStyle()फ़ंक्शन प्रदान करता है । एलेसेंड्रो रानाल्दी द्वारा समाधान के आधार पर, लेकिन फ़ंक्शन को पारित करने के लिए वर्तमान iselectable value की आवश्यकता नहीं है।

extension UITextView{
    func setTextInCurrentStyle(_ newText: String) {
        let selectablePreviously = self.isSelectable
        isSelectable = true
        text = newText
        isSelectable = selectablePreviously
    }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.