从Xcode 11.1升级到Xcode 11.2后,由于_UITextLayoutView,应用程序崩溃


351

从Xcode 11.1升级到Xcode 11.2之后,我的应用崩溃了:

***由于未捕获的异常'NSInvalidUnarchiveOperationException'而终止应用程序,原因:'无法实例化名为_UITextLayoutView的类,因为未找到名为_UITextLayoutView的类;该类需要在源代码中定义或从库中链接(确保该类是正确目标的一部分)'

为什么会这样呢?如何防止此崩溃?


17
似乎是Xcode 11.2错误。检查线程forums.developer.apple.com/thread/125287。它最有可能与层次结构中的TextView有关
Pavel Stepanov

3
不幸的是,@ DanielStorm没有帮助。我刚刚将一个普通的UITextView添加到一个以前没有的屏幕上(并且之前也没有崩溃:))。现在,它以相同的错误崩溃。除了最新的iOS 13.2
Pavel Stepanov,

3
有人知道在iOS 13.1.2设备上运行时,这是否会使使用Xcode 11.2构建的生产应用程序崩溃?
gfpacheco

2
这是一个非常好的问题,因此获得了198票,所以我真的不确定为什么有人将其标记为“暂停搁置”
Mike Volmar,

4
我投票关闭@MikeVolmar,不再相关。它已在11.2.1中修复。这个问题的有用性很短。
rmaddy19 '11

Answers:


145

恭喜啦

新版本的Xcode(11.2.1)现在可用,这是摆脱此问题的最佳方法。

解决方法

@Mojtaba Hosseini我提出的解决方案是基于StackOverflow的帮助和参与我的其他开发人员的。您,我以及此处的所有其他开发人员已经知道,当Apple宣布新版本时,此问题将消失。

但是除了一切

由于完全不涉及私有API,因此上述解决方案已被Apple Review接受。这种方法非常类似于创建属性,例如

@interface UITextView(布局)

要么

UITextView + Layout.h

因此,当您创建属性时,您将直接使用APPLE私有组件并根据您的需求或要求对其进行重新调制。

最简单的示例是AMFNetworking类

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

希望我已经完成指控

下面的答案只是我方面的一些帮助,可以使开发人员继续开发,就像我们最初建议开发人员回滚Xcode一样。再次下载8 GB Xcode是一个不好的做法,因为我们都知道Xcode的新版本将很快发布。

虽然它已在Xcode 11.2.1中修复,但是我得到了一个针对Xcode 11.2的解决方案,您可以通过它解决此崩溃:

***由于未捕获的异常'NSInvalidUnarchiveOperationException'而终止应用程序,原因:'无法实例化名为_UITextLayoutView的类,因为未找到名为_UITextLayoutView的类;该类需要在源代码中定义或从库中链接(确保该类是正确目标的一部分)'

转到“构建设置”搜索“ DEAD_CODE_STRIPPING”并将其设置为“ NO”

DEAD_CODE_STRIPPING = NO

然后

创建文件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

在应用程序委托中执行

#import "UITextViewWorkaround.h"

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

            [UITextViewWorkaround executeWorkaround];
    return yes;
    }

编译代码,您将拥有一个正在运行的应用程序:)


2
如果其工作不能请个等级上升使其他的可以试试这个解决方案,以及
阿夫塔卜·穆罕默德汗

3
@Hardy_Germany我对此进行了一些测试,可以为Swift进行尝试:类UITextViewWorkaround:NSObject {类func executeWorkaround(){如果#available(iOS 13.2,*){}其他{让className =“ _UITextLayoutView” var cls = objc_getClass(className )if cls == nil {cls = objc_allocateClassPair(UIView.self,className,0)objc_registerClassPair(cls as!AnyClass)#if DEBUG print(“添加%@动态\ n”,className); #endif}}}}
约翰·尼米斯

2
如果你用斯威夫特包管理器和Xcode 11.2 @DaveDude DEAD_CODE_STRIPPING = NO需要
心教堂

5
@pradipsutariya是,当然,为什么我们不改变APPLE CLASSES的任何内容。
阿夫塔布·穆罕默德·汗

5
仅发布Xcode 11.2.1 GM种子(测试版)。稳定版本可能会很快发布。
拉里·克里希纳

221

更新:固定!🎉🎊

唯一的解决方案是更新

错误已在Xcode 11.2.1中修复。因此,您可以从此处下载并使用它。

包含UITextView的情节提要板将不再导致应用程序在iOS 13.2,tvOS 13.2或macOS 10.15.2之前的操作系统版本上崩溃。(56808566,56873523)


Apple已于2019年11月5日弃用Xcode 11.2

如果您曾经尝试将使用Xcode 11.2构建的应用程序提交到AppStore,则将被拒绝:

App Store Connect操作警告

警告ITMS-90703:“不建议使用Xcode Build。由于已解决的应用程序存档问题,我们已于2019年11月5日弃用了Xcode 11.2。下载Xcode 11.2.1或更高版本,重建您的应用程序并重新提交。”

因此,使用Xcode 11.2完成的所有变通办法都没有用


这是Xcode 11.2的错误,已在Xcode 11.2.1中修复。

解决方案

回滚到之前的Xcode 发布版本从:回滚是不是一种选择了和AppStore的将拒绝任何的Xcode构建以下11.2.1 看看这个

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

请注意,您应该使用Safari下载它,并且必须首先登录到Apple开发人员门户

您可以在https://developer.apple.com/download/more找到所有其他Xcode版本和其他资源链接(包括发行版和Beta版)。

解决方法

这非常困难,但是可以解决。替换所有UITextView以s 故事板 S和厦门国际银行有s 纯代码版本。


请注意,错误已由Apple找到并修复。

固定

同样,该错误已由Apple Staff edford确认

确认书


对于使用iOS 13.2且无法再使用Xcode 11.1的用户:

  1. 将macOS更新到10.15.1或更高版本
  2. 安装Xcode 11.2.1或更高版本
  3. 现在应该可以在更新的设备上工作了。

对于那些拥有分镜脚本的用户:

  1. 子类 UITextView
  2. 分配给所有UITextView对象
  3. 不要忘记更新可能在子类中丢失的任何属性更改。

对于那些习惯方法混乱的人(OBJC和动态行为)

转到Objective-C@aftab muhammed khan 答案Swift适应版本的@MikRo 答案

只是不再这样做:

即使这最后两个麻烦的解决方法没有使用Apple私有API,它们也会在AppStore中被拒绝,因为Apple不会接受11.2.1下的Xcode版本的构建

再一次:

Apple已于2019年11月5日弃用Xcode 11.2


3
悲伤,但是解决方案对我有用。谢谢!11.1的作品。我不建议转换为纯代码,因为我敢打赌很快就会有一个修复程序。如果您不介意:有新版本可用时,请更新此答案。如果人们开始下载11.1事件,尽管那里有一个固定的版本,那就

2
我已经有11.1,但没有用,没有升级到11.2。
JAHelia '19

6
请注意,您可能应该从开发设备中删除应用程序和/或清理Xcode的build文件夹(CMD + Shift + K
JeroenJK

3
如何升级到v11.2.1?它没有显示在应用商店上。从开发人员门户网站下载GM种子会尝试以大约8gb的价格全部下载该应用程序!
mesqueeb

3
另外,如果不建议使用,为什么Apple现在不立即在应用商店中删除11.2?
马尔科姆·萨尔瓦多

40

该问题已在Xcode 11.2.1中修复。

编辑:现在发布了此修复程序,您应该切换到该Xcode版本并注释掉此变通办法。正如Mojtaba Hosseini在他的回答中提到的那样:

...这两个令人毛骨悚然的解决方法正在使用Apple私有API,将被Apple审查拒绝!

在Apple发布此修复程序之前,这是继续开发和测试的好方法。


对于Xcode 11.2,基于Aftab Muhammed Khan的想法,并在John Nimis的帮助下,我仅测试了以下代码。

情节提要文件中无需更改!

编辑了我的AppDelegate.swift文件并添加了此类

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

并在对“ didFinishLaunchingWithOptions”的委托调用中调用解决方法

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

我已将可汗的Obj-C解决方案改编为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!)
            }
        }
    }

}

在结束说它didFinishLaunchingWithOptionsAppDelegate

谢谢@Aftab!


我们需要在哪里添加此代码?在委托文件中?
SIDHARTH PU

@SIDHARTHPU你可以叫它didFinishLaunchingWithOptions
拉尔克里希纳

尝试了有关此问题的各种修复程序,而这个方法直到Xcode 11.3才成功了!谢谢!
FlimFlam Vir

1
这是最简短,最出色的解决方案!
sVd

1
@LalKrishna创建一个名为UITextViewWorkaround.swift的新文件,并将上述代码添加到其中。然后在return语句之前将UITextViewWorkaround.executeWorkaround()添加到didFinishLaunchingWithOptions中。
ashishn

22

更快的修复:

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

将此代码添加到某处,然后将所有情节提要实例替换为FixedTextView

注意:您将丢失在情节提要中创建的所有属性。这可能会产生严重的影响(例如,委托人设置,人数等)


这似乎是迈向解决方案的好一步,但还不是解决方案……
Fattie

18

更新的解决方案: 更新到Xcode 11.2.1。我可以在iOS 11、12或13设备上使用它。

请参阅苹果的文档 此更新解决了一个关键问题,该问题可能导致使用UITextView的应用程序崩溃。

旧解决方案:以下位置下载了Xcode 11.1 https://developer.apple.com/download/more/ 从11.2切换回11.1修复了崩溃。

同样,即使对于Xcode 11.2,当我将iPhone升级到13.2时,它也解决了崩溃问题。


2
这是最简单的解决-升级iPhone的iOS以13.2
Reefwing

6
鉴于OP是在开发人员的角度进行讨论,因此升级iOS显然不是解决方案。
keeshux

2
苹果确认该错误发生在13.2和Xcode 11.2之前的iOS版本中。
Chuck Krutsinger

将XCode降级至版本11.1(11A1027)-仍然存在相同的崩溃(
-Rommex

如果您升级或降级,并且仍然按照下面Wojteck的评论崩溃,则清理干净的Xcode的build文件夹(CMD + Shift + K),这对我而言已解决了升级
Mike Volmar,

17

11.2.1转基因种子解决了这个问题

(它可以用于发布到App Store)

转到https://developer.apple.com/download/。下载Xcode 11.2.1 GM种子

发行说明确认它已解决此错误:

在此处输入图片说明


5
请注意,在安装Xcode 11.2.1 GM种子之后,您可能应该从开发设备中删除该应用程序和/或清理Xcode的build文件夹(CMD + Shift + K)。
Wojtek Dmyszewicz

13

您可以从Apple开发人员网站下载最新的Xcode beta版本(11.2.1 GM)。

这里直接链接

Xcode 11.2.1 GM种子


请注意,在安装Xcode 11.2.1 GM种子之后,您可能应该从开发设备中删除该应用程序和/或清理Xcode的build文件夹(CMD + Shift + K)。
Wojtek Dmyszewicz

无需任何其他步骤即可安装和运行。问题已修复✌️–
BossOz

我该如何安装呢?它给了我一个文件夹,但没有可执行文件
Scobee

1
只需从提供的链接下载zip并将其解压缩即可。然后将应用程序复制到“应用程序”文件夹中。
BossOz

1
问题是,当我提取它时,我得到了两个文件,内容和元数据...这就是为什么我问如何处理它们。我使用了存档实用程序,因为单击它通常会失败。我再试一次
斯科比

12

@garafajon答案的改进。对我来说,它在大多数情况下都有效。

///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
完美运作。@garafajon的代码导致意外地方中的框出现问题。这解决了这些问题〜辛苦了!
ekrenzin


6

这是Xcode 11.2的错误。子类化的Textviews在未安装neweset iOS内部版本(13.2)的所有设备上崩溃。您最好不要使用该版本构建发行版。

你现在可以:

  • 将Xcode降级为11.1或
  • 将设备升级到iOS 13.2

1
那么,此错误仅影响子类化的文本视图吗?
达伦(Darren)

1
更新Xcode时更新iOS可解决此问题。
Buyin Brian

2
问题是,如果崩溃将发生在每个iOS小于13.2的已发布应用上...我恐怕要尝试...
mark.so.cgn

6

我使用了成功的解决方法,但这很痛苦。这是我遵循的过程:

  1. 在文本编辑器中打开XIB
  2. 查找违规行为TextView。就我而言:
<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. 注意它id(在我的情况下:id="782-j1-88c"
  2. 按照上面的答案覆盖该类,然后重新创建选项(我的是Objective-C,抱歉):
@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. 请注意包括文本视图ID的约束,并针对视图或视图控制器中的其他元素ID重新创建这些约束。就我而言:
- (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;
}

这样做对我来说解决了这个问题,而不会损失所需的功能。幸运的是我只UITextView需要更换一个。否则,这将变得站不住脚。



0

1.问题:

Xcode 11.2存在一个问题,其中包含UITextView的情节提要如果使用Xcode 11.2编译,则该应用程序将在iOS 13.2之前的OS版本上崩溃。

Xcode 11.2

查看此Apple文档

2.解决方案:

唯一的解决方案是将Xcode更新为11.2.111.3。

Xcode 11.2.1特别发布,以解决此崩溃问题。

在此处输入图片说明 查看此苹果文档。

3.建议:

我建议您使用Xcode 11.3的最新版本,因为它支持为iOS 13.3开发应用程序,并且还有许多新功能。查看此Apple文档


-1

此问题已在Xcode版本11.2.1中修复,并在发行说明中指出:

此更新解决了一个关键问题,该问题可能导致使用UITextView的应用崩溃

Xcode发行说明屏幕快照

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.