Dopo l'aggiornamento a Xcode 11.2 da Xcode 11.1, l'app si arresta in modo anomalo a causa di _UITextLayoutView


351

Dopo l'aggiornamento a Xcode 11.2 da Xcode 11.1 la mia app si arresta in modo anomalo:

*** Chiusura dell'app a causa dell'eccezione non rilevata 'NSInvalidUnarchiveOperationException', motivo: 'Impossibile creare un'istanza della classe denominata _UITextLayoutView perché non è stata trovata alcuna classe denominata _UITextLayoutView; la classe deve essere definita nel codice sorgente o collegata da una libreria (assicurarsi che la classe faccia parte del target corretto) '

Perché sta succedendo? Come posso prevenire questo arresto?


17
Sembra il bug Xcode 11.2. Controlla la discussione forum.developer.apple.com/thread/125287 . Molto probabilmente è correlato alle TextView nella gerarchia
Pavel Stepanov,

3
@DanielStorm purtroppo non ha aiutato. Ho appena aggiunto un semplice UITextView a uno schermo che non lo aveva prima (e non si è arrestato in modo anomalo prima :)). Ora si blocca con lo stesso errore. Il problema persiste per tutti i dispositivi / simulatori ad eccezione dell'ultimo iOS 13.2
Pavel Stepanov,

3
Qualcuno sa se questo causerà l'arresto anomalo delle app di produzione create con Xcode 11.2 durante l'esecuzione su dispositivi iOS 13.1.2?
gfpacheco,

2
questa è una domanda perfettamente valida, da qui i 198 voti, quindi non sono davvero sicuro del perché qualcuno l'abbia contrassegnato come "messo in attesa poco chiaro"
Mike Volmar,

4
@MikeVolmar Ho votato per chiudere e non è più pertinente. È stato risolto con 11.2.1. Questa domanda aveva una finestra di utilità molto breve.
rmaddy,

Risposte:


145

congratulazione

La nuova versione di Xcode (11.2.1) è ora disponibile che è il modo migliore per sbarazzarsi di questo problema.

soluzioni alternative

@Mojtaba Hosseini la soluzione che ho proposto è stata l'aiuto e la partecipazione da parte mia ai miei colleghi sviluppatori su StackOverflow. Tu, io e tutto il resto dello sviluppatore qui già sappiamo che quando la nuova versione verrà annunciata da Apple, questo problema sarà risolto.

Ma accanto a tutto

La soluzione di cui sopra è stata definitivamente accettata da Apple Review in quanto non è coinvolta alcuna API privata. Questo approccio è molto simile alla creazione di proprietà simili

@interface UITextView (Layout)

O

UITextView + Layout.h

Quindi, quando si crea una proprietà, si utilizzano direttamente i componenti privati ​​APPLE e li si rimodula secondo le proprie esigenze o necessità.

L'esempio semplice sono le classi AMFNetworking

- (void)setImageWithURL:(NSURL *)url {
    [self setImageWithURL:url placeholderImage:nil];
}

Spero di aver finito con l'accusa

La risposta che segue è stata solo un po 'di aiuto da parte mia per consentire allo sviluppatore di continuare a sviluppare mentre inizialmente proponevamo allo sviluppatore di ripristinare Xcode. È stata una brutta pratica scaricare di nuovo Xcode da 8 GB poiché sappiamo tutti che la nuova versione di Xcode sarà rilasciata presto.

Mentre è stato risolto in Xcode 11.2.1, ho ottenuto una soluzione per Xcode 11.2 con la quale è possibile eliminare questo crash:

*** Chiusura dell'app a causa dell'eccezione non rilevata 'NSInvalidUnarchiveOperationException', motivo: 'Impossibile creare un'istanza della classe denominata _UITextLayoutView perché non è stata trovata alcuna classe denominata _UITextLayoutView; la classe deve essere definita nel codice sorgente o collegata da una libreria (assicurarsi che la classe faccia parte del target corretto) '

SOLUZIONE

Vai alla ricerca di Build Build per "DEAD_CODE_STRIPPING" e impostalo su NO

DEAD_CODE_STRIPPING = NO

Poi

creare file UITextViewWorkaround

UITextViewWorkaround.h

    #import <Foundation/Foundation.h>


    @interface UITextViewWorkaround : NSObject
    + (void)executeWorkaround; 
@end

UITextViewWorkaround.m

#import "UITextViewWorkaround.h"
#import  <objc/runtime.h>



    @implementation UITextViewWorkaround

    + (void)executeWorkaround {
        if (@available(iOS 13.2, *)) {
        }
        else {
            const char *className = "_UITextLayoutView";
            Class cls = objc_getClass(className);
            if (cls == nil) {
                cls = objc_allocateClassPair([UIView class], className, 0);
                objc_registerClassPair(cls);
    #if DEBUG
                printf("added %s dynamically\n", className);
    #endif
            }
        }
    }

    @end

eseguirlo nel delegato dell'app

#import "UITextViewWorkaround.h"

        - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
            // Override point for customization after application launch.

            [UITextViewWorkaround executeWorkaround];
    return yes;
    }

Compila il codice e avrai un'app in esecuzione :)


2
Se sta funzionando per te, ti preghiamo gentilmente di classificare, così anche altri possono provare questa soluzione
aftab muhammed khan

3
@Hardy_Germany L'ho provato un po ', per Swift puoi provare: class UITextViewWorkaround: NSObject {class func executeWorkaround () {if #available (iOS 13.2, *) {} else {let className = "_UITextLayoutView" var cls = objc_getClass (className ) se cls == nil {cls = objc_allocateClassPair (UIView.self, className, 0) objc_registerClassPair (cls as! AnyClass) #if DEBUG print ("aggiunto% @ dynamically \ n", className); #endif}}}}
John Nimis,

2
@DaveDude DEAD_CODE_STRIPPING = NO è necessario se si utilizza Swift Package Manager con Xcode 11.2
Cœur

5
@pradipsutariya sì, ovviamente, perché non cambiamo mai nulla nelle CLASSI DI MELE.
aftab muhammed khan,

5
Viene rilasciato solo il seme Xcode 11.2.1 GM (beta). La versione stabile potrebbe essere rilasciata presto.
Lal Krishna,

221

Aggiornamento: risolto! 🎉🎊

L'unica soluzione è l'aggiornamento

Questo errore è stato corretto in Xcode 11.2.1. Quindi puoi scaricarlo e usarlo da qui.

Gli storyboard contenenti UITextView non causeranno più l'arresto anomalo dell'app su versioni del sistema operativo precedenti a iOS 13.2, tvOS 13.2 o macOS 10.15.2. (56808566, 56873523)


Xcode 11.2 è deprecato da Apple il 5 novembre 2019

se provi mai a inviare la tua app compilata con Xcode 11.2 all'App Store, verrai rifiutato:

Avviso sull'operazione di connessione App Store

AVVISO ITMS-90703 : "Build Xcode obsoleto. A causa di problemi risolti relativi agli archivi delle app, il 5 novembre 2019 abbiamo deprecato Xcode 11.2. Scarica Xcode 11.2.1 o versioni successive, ricostruisci la tua app e reinvia."

Quindi tutte le soluzioni alternative eseguite con Xcode 11.2 sono inutili


È un bug per Xcode 11.2 e risolto in Xcode 11.2.1.

Soluzione (s)

Ripristina la precedente versione di Xcode da: Il rollback non è più un'opzione e AppStore rifiuta qualsiasi build con Xcode inferiore a 11.2.1. Dai un'occhiata a questo

https://developer.apple.com/services-account/download?path=/Developer_Tools/Xcode_11.1/Xcode_11.1.xip

Nota che dovresti usare Safari per scaricarlo e devi prima accedere al portale per sviluppatori Apple .

Puoi trovare tutte le altre versioni di Xcode e altri link alle risorse (incluse le versioni di rilascio e beta) qui a https://developer.apple.com/download/more

La soluzione alternativa

Questo è molto difficile ma risolvendo il problema. Sostituisci tutte le UITextViews negli storyboard e Xib con la versione in puro codice .


Si noti che questo errore viene rilevato e corretto da Apple

Fisso

Anche in precedenza, il bug era stato confermato da Apple Staff Edford

Conferma


Per quelli con iOS 13.2 e non possono più usare Xcode 11.1:

  1. Aggiorna macOS alla 10.15.1 o successive
  2. Installa Xcode 11.2.1 o successivo
  3. Dovrebbe funzionare ora sul dispositivo aggiornato.

Per quelli con storyboard:

  1. sottoclasse UITextView
  2. Assegnalo a tutti gli UITextViewoggetti
  3. Non dimenticare di aggiornare eventuali modifiche alle proprietà che potrebbero andare perse nella sottoclasse.

Per chi è a proprio agio con il metodo sfrigolante (Objc e comportamento dinamico)

Dirigetevi verso la @aftab Muhammed Khan risposta per Objective-C e @MikRo risposta per Swift versione adattata

Basta non farlo più:

Anche se queste ultime due soluzioni alternative non utilizzano l'API privata di Apple , verranno rifiutate in AppStore perché Apple non accetterà build con versioni Xcode sotto 11.2.1 !

E ancora una volta:

Xcode 11.2 è deprecato da Apple il 5 novembre 2019


3
Triste, ma la soluzione funziona per me. Grazie! 11.1 funziona. Non consiglierei la conversione in codice puro, perché scommetto che presto uscirà una soluzione. Se non ti dispiace: aggiorna questa risposta una volta che c'è una nuova versione che funziona. Sarebbe un male se le persone iniziassero a scaricare l'evento 11.1 anche se c'è una versione fissa là fuori :)
Sebastian Weiß

2
Ho già 11.1 ma non ha funzionato, non ho aggiornato a 11.2.
JAHelia,

6
Nota che probabilmente dovresti eliminare l'app dal tuo dispositivo di sviluppo e / o pulire la cartella build di Xcode ( CMD + Shift + K)
JeroenJK

3
Come posso aggiornare alla v11.2.1? Non viene visualizzato su App Store. E scaricando il seme GM dal portale degli sviluppatori prova a scaricare l'app dappertutto per circa 8 GB!
mesqueeb

3
Inoltre, se è obsoleto, perché Apple non rimuove l'11.2 dall'app store per ora?
Malcolm Salvador,

40

Il problema è stato risolto in Xcode 11.2.1.

EDIT: ora che la correzione è stata rilasciata, dovresti passare a quella versione di Xcode e commentare questa soluzione alternativa. Come ha affermato Mojtaba Hosseini nella sua risposta:

... queste ultime due soluzioni alternative utilizzano l'API privata di Apple e verranno rifiutate dalla recensione di Apple!

Per il tempo fino a quando la correzione non è stata rilasciata da Apple, questa è stata una buona soluzione per continuare a sviluppare e testare.


Per Xcode 11.2, basato sull'idea di Aftab Muhammed Khan e con l'aiuto di John Nimis ho appena testato il seguente codice.

Non è necessario modificare i file dello storyboard!

Ho modificato il mio file AppDelegate.swift e aggiunto questa classe

//******************************************************************
// MARK: - Workaround for the Xcode 11.2 bug
//******************************************************************
class UITextViewWorkaround: NSObject {

    // --------------------------------------------------------------------
    // MARK: Singleton
    // --------------------------------------------------------------------
    // make it a singleton
    static let unique = UITextViewWorkaround()

    // --------------------------------------------------------------------
    // MARK: executeWorkaround()
    // --------------------------------------------------------------------
    func executeWorkaround() {

        if #available(iOS 13.2, *) {

            NSLog("UITextViewWorkaround.unique.executeWorkaround(): we are on iOS 13.2+ no need for a workaround")

        } else {

            // name of the missing class stub
            let className = "_UITextLayoutView"

            // try to get the class
            var cls = objc_getClass(className)

            // check if class is available
            if cls == nil {

                // it's not available, so create a replacement and register it
                cls = objc_allocateClassPair(UIView.self, className, 0)
                objc_registerClassPair(cls as! AnyClass)

                #if DEBUG
                NSLog("UITextViewWorkaround.unique.executeWorkaround(): added \(className) dynamically")
               #endif
           }
        }
    }
}

e all'interno della chiamata del delegato per "didFinishLaunchingWithOptions" chiamare la soluzione alternativa

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

    // Override point for customization after application launch.

    // This is the workaround for Xcode 11.2
    UITextViewWorkaround.unique.executeWorkaround()
}

34

Ho adattato la soluzione Obj-C di khan a Swift :

import UIKit

@objc
class UITextViewWorkaround : NSObject {

    static func executeWorkaround() {
        if #available(iOS 13.2, *) {
        } else {
            let className = "_UITextLayoutView"
            let theClass = objc_getClass(className)
            if theClass == nil {
                let classPair: AnyClass? = objc_allocateClassPair(UIView.self, className, 0)
                objc_registerClassPair(classPair!)
            }
        }
    }

}

Chiamalo alla fine di didFinishLaunchingWithOptionsin AppDelegate.

Grazie @Aftab!


dove dobbiamo aggiungere questo codice? In file delegati?
SIDHARTH PU

@SIDHARTHPU puoi chiamarlodidFinishLaunchingWithOptions
Lal Krishna il

provato una varietà di correzioni su questo problema e questo ha fatto il trucco fino a Xcode 11.3 ?! Grazie!
FlimFlam Vir,

1
Questa è la soluzione più breve e brillante!
venerdì

1
@LalKrishna Crea un nuovo file chiamato UITextViewWorkaround.swift e aggiungi sopra il codice. Quindi aggiungere UITextViewWorkaround.executeWorkaround () questo a didFinishLaunchingWithOptions prima dell'istruzione return.
ashishn,

22

Una soluzione più rapida:

///Substitute class for _UITextLayoutView bug
class FixedTextView: UITextView {
    required init?(coder: NSCoder) {
        if #available(iOS 13.2, *) {
            super.init(coder: coder)
        }
        else {
            let rect = CGRect(origin: .zero, size: CGSize(width: 100, height: 44*3))
            super.init(frame: rect, textContainer: nil)
        }
    }
}

Aggiungi questo codice da qualche parte e quindi sostituisci tutte le istanze dello storyboard in FixedTextView .

Nota: perderai tutti gli attributi creati negli storyboard. Ciò potrebbe avere serie implicazioni (ad es. Impostazione dei delegati, dimensioni, ecc.)


Questo sembra essere un buon passo verso una soluzione alternativa, ma non è ancora una soluzione ...
Fattie

18

Soluzione aggiornata: aggiornamento a Xcode 11.2.1 . Funziona su dispositivi iOS 11, 12 o 13 per me.

Fare riferimento alla documentazione di Apple Questo aggiornamento risolve un problema critico che potrebbe causare l'arresto anomalo delle app che utilizzano UITextView.

Vecchia soluzione: Xcode 11.1 scaricato da https://developer.apple.com/download/more/ Il passaggio da 11.2 a 11.1 ha risolto il problema.

Inoltre, anche per me con Xcode 11.2, quando ho aggiornato il mio iPhone a 13.2, ciò ha risolto il crash.


2
Questa è la soluzione più semplice: aggiorna l'iPhone iOS alla 13.2
Reefwing il

6
L'aggiornamento di iOS non è chiaramente una soluzione dato che OP sta parlando in una prospettiva di sviluppo.
Keeshux,

2
Apple ha confermato che il bug si verifica con le versioni iOS precedenti alla 13.2 e Xcode 11.2.
Chuck Krutsinger,

Declassato XCode alla versione 11.1 (11A1027) - ha ancora lo stesso crash (
rommex,

se esegui l'upgrade o il downgrade e si blocca ancora la cartella di build pulita di Xcode (CMD + Shift + K) secondo il commento di Wojteck di seguito, che ha risolto questo problema durante l'aggiornamento
Mike Volmar,

17

11.2.1 I semi GM risolvono questo problema

(e può essere utilizzato per pubblicare su App Store)

Vai su https://developer.apple.com/download/ . Scarica Xcode 11.2.1 seme GM

Le note sulla versione confermano che risolve questo errore:

inserisci qui la descrizione dell'immagine


5
Si noti che dopo l'installazione del seeding Xcode 11.2.1 GM probabilmente si dovrebbe eliminare l'app dal dispositivo di sviluppo e / o pulire la cartella di build di Xcode (CMD + Shift + K).
Wojtek Dmyszewicz,

13

Puoi andare a scaricare l'ultima versione beta di Xcode (11.2.1 GM) dal sito Web degli sviluppatori Apple.

Qui il link diretto

Xcode 11.2.1 Sementi GM


Si noti che dopo l'installazione del seeding Xcode 11.2.1 GM probabilmente si dovrebbe eliminare l'app dal dispositivo di sviluppo e / o pulire la cartella di build di Xcode (CMD + Shift + K).
Wojtek Dmyszewicz,

installato ed eseguito senza altre procedure. Problema risolto ✌️
BossOz

come lo installo? Mi ha dato una cartella, ma non c'è un eseguibile
Scobee,

1
basta scaricare zip dal link fornito ed estrarlo. Quindi copia l'app nella cartella dell'applicazione.
BossOz,

1
il problema è che quando lo estraggo, ottengo due file, Content e Metadata ... ecco perché ho chiesto cosa farne. Ho usato un'utilità di archiviazione perché facendo clic su di essa normalmente non funzionava. Ci riproverò
Scobee,

12

Miglioramento della risposta @garafajon. Per me funziona nella maggior parte dei casi.

///Substitute class for _UITextLayoutView bug
class FixedTextView: UITextView {
    required init?(coder: NSCoder) {
        if #available(iOS 13.2, *) {
            super.init(coder: coder)
        }
        else {
            super.init(frame: .zero, textContainer: nil)
            self.autoresizingMask = [.flexibleWidth, .flexibleHeight]
            self.contentMode = .scaleToFill

            self.isScrollEnabled = false   // causes expanding height

            // Auto Layout
            self.translatesAutoresizingMaskIntoConstraints = false
            self.font = UIFont(name: "HelveticaNeue", size: 18)
        }
    }
}

1
Funziona perfettamente. Il codice di @ garafajon ha causato problemi con le scatole in luoghi inaspettati. Questo risolve questi problemi ~ ottimo lavoro!
ekrenzin,

8

Come soluzione "rapida" è possibile aggiungere UITextViewdirettamente dal codice e non tramite IB. Almeno ha funzionato per me. Anche se dal mio punto di vista è meglio tornare al precedente Xcode / attendere quello nuovo.


6

È un bug con Xcode 11.2. Le visualizzazioni di testo in sottoclasse si arrestano in modo anomalo su tutti i dispositivi in ​​cui non è installato il nuovo iOS build (13.2). Probabilmente è meglio non creare una versione con quella build.

Tu puoi ora:

  • downgrade di Xcode a 11.1 o
  • aggiorna il tuo dispositivo a iOS 13.2

1
Quindi questo bug ha effetto solo sulle viste di testo sottoclasse?
Darren,

1
L'aggiornamento di iOS durante l'aggiornamento di Xcode risolve il problema.
Acquisto Brian

2
La domanda è: se il crash si verificherà su un'app rilasciata con ogni iOS più piccolo di 13.2 ... Temo di provare ...
mark.so.cgn

6

Ho usato una soluzione alternativa di successo, ma è stato doloroso. Questo è il processo che ho seguito:

  1. Apri XIB in un editor di testo
  2. Trova il colpevole TextView. Nel mio caso:
<textView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" textAlignment="natural" translatesAutoresizingMaskIntoConstraints="NO" id="782-j1-88c" customClass="LCAnsiConsoleTextView">
  <rect key="frame" x="16" y="20" width="343" height="589"/>
  <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
  <fontDescription key="fontDescription" name="Menlo-Regular" family="Menlo" pointSize="12"/>
  <textInputTraits key="textInputTraits" autocapitalizationType="sentences"/>
</textView>
  1. Nota il suo id(nel mio caso:id="782-j1-88c" :)
  2. Sostituisci la classe come indicato nelle risposte sopra e ricrea le opzioni (la mia è Objective-C, scusa):
@implementation FixedTextView

- (id) initWithCoder:(NSCoder*)coder
{
    if ([[NSProcessInfo processInfo] isOperatingSystemAtLeastVersion:(NSOperatingSystemVersion){13,2,0}])
        self = [super initWithCoder:coder];
    else {
        self = [super initWithFrame:CGRectMake(16, 3, 343, 605)];
        self.editable = YES;
        self.selectable = YES;
        self.insetsLayoutMarginsFromSafeArea = YES;
        self.clipsToBounds = YES;
        self.clearsContextBeforeDrawing = YES;
        self.autoresizesSubviews = YES;
        self.contentMode = UIViewContentModeScaleToFill;
        self.scrollEnabled = YES;
        self.userInteractionEnabled = YES;
        self.multipleTouchEnabled = YES;
        self.translatesAutoresizingMaskIntoConstraints = NO;
        self.font = [UIFont fontWithName:@"Menlo-Regular" size:12.0];
    }
    return self;
}
  1. Notare i vincoli che includono l'ID della vista di testo e ricrearli rispetto agli altri ID elemento nella vista o nel controller della vista. Nel mio caso:
- (id) initWithCoder:(NSCoder *)aDecoder
{
    self = [super initWithCoder:aDecoder];
    if (self) {
        [self xibSetup];
        [self initView];
/*
        <constraint firstItem="75C-lt-YtE" firstAttribute="top" secondItem="782-j1-88c" secondAttribute="bottom" constant="8" symbolic="YES" id="8SH-5l-FAs"/>
        <constraint firstItem="782-j1-88c" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leadingMargin" id="Mve-aZ-HCe"/>
        <constraint firstItem="782-j1-88c" firstAttribute="leading" secondItem="75C-lt-YtE" secondAttribute="leading" id="dPG-u3-cCi"/>
        <constraint firstItem="782-j1-88c" firstAttribute="trailing" secondItem="iN0-l3-epB" secondAttribute="trailingMargin" id="sjT-0Q-hNj"/>
        <constraint firstItem="782-j1-88c" firstAttribute="top" secondItem="vUN-kp-3ea" secondAttribute="top" id="vic-vZ-osR"/>
*/
        [self.command.topAnchor constraintEqualToAnchor:self.console.bottomAnchor constant:8].active = YES;
        [self.console.leadingAnchor constraintEqualToAnchor:self.layoutMarginsGuide.leadingAnchor].active = YES;
        [self.console.leadingAnchor constraintEqualToAnchor:self.command.leadingAnchor].active = YES;
        [self.console.trailingAnchor constraintEqualToAnchor:self.trailingAnchor].active = YES;
        [self.console.topAnchor constraintEqualToAnchor:self.safeAreaLayoutGuide.topAnchor].active = YES;

    }
    return self;
}

In questo modo ho risolto il problema senza perdere la funzionalità desiderata. Fortunatamente ne avevo solo uno UITextViewda sostituire. Altrimenti, questo diventa insostenibile.


2

Ho avuto lo stesso problema che ho appena aggiornato il mio Xcode da 11.2 a 11.2.1 ha funzionato bene.

Dopo l'aggiornamento ho provato lo stesso su iOS 13 e iOS 12 e funzionava bene.


Duplica della risposta BossOz.
Cœur il

0

1. Problema:

C'è un problema con Xcode 11.2 in cui gli storyboard contenenti un UITextView causeranno l'arresto anomalo dell'app su versioni del sistema operativo precedenti a iOS 13.2 se compilato con Xcode 11.2.

Xcode 11.2

Controlla questa documentazione di Apple .

2. Soluzione:

L'unica soluzione è aggiornare il tuo Xcode a 11.2.1 o 11.3.

Xcode 11.2.1 è stato rilasciato in particolare per risolvere questo problema di arresto anomalo.

inserisci qui la descrizione dell'immagine Controlla questa documentazione di Apple.

3. Suggerimento:

Ti suggerirei di andare con l'ultima versione di Xcode 11.3 poiché supporta lo sviluppo di app per iOS 13.3 e ci sono anche molte nuove funzionalità. Controlla questa documentazione di Apple .


-1

Questo problema è stato risolto in Xcode versione 11.2.1 e indicato nelle note di rilascio:

Questo aggiornamento risolve un problema critico che potrebbe causare l'arresto anomalo delle app che utilizzano UITextView

Schermata delle note di rilascio di Xcode

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.