从Xcode 11.1升级到Xcode 11.2后,应用因_UITextLayoutView而崩溃

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

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

为什么会这样?我怎样才能防止这种崩溃?

57880 次浏览

作为一个“快速”修复,你可以直接从代码中添加UITextView,而不是通过IB。至少它对我有用。虽然从我的角度来看,最好回滚到以前的Xcode/等待新的。

更新:固定!🎉🎊

唯一的解决办法就是更新

这个错误是Xcode 11.2.1中的< >强固定< / >强。所以你可以从这里下载并使用它

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


2019年11月5日,苹果公司已弃用Xcode 11.2

如果你试图将用Xcode 11.2构建的应用程序提交到AppStore,你将被拒绝:

App Store连接操作警告

警告itm - 90703: "Deprecated Xcode Build。由于已解决的应用程序存档问题,我们已于2019年11月5日弃用Xcode 11.2。下载Xcode 11.2.1或更新版本,重新构建应用并重新提交。”

所以Xcode 11.2所做的所有变通都是无用的


这是Xcode 11.2的bug,在Xcode 11.2.1中修复。

解决方案(年代)

回滚到以前的Xcode release版本:回滚不再是一个选项,AppStore将拒绝任何构建与Xcode低于11.2.1 看看这个

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

请注意,你应该使用Safari来下载它,你必须首先登录苹果开发者门户

你可以在https://developer.apple.com/download/more找到所有其他Xcode版本和其他资源链接(包括发行版和测试版) < / s > < / p >

的解决方案

这是非常困难的,但可行的解决方案。 将__abc1和__abc2中的所有__abc0替换为纯代码版本

请注意,这个苹果发现并修复了这个错误

Fixed

同样在早些时候,这个错误Apple Staff edford确认

 confirm


对于那些使用iOS 13.2且不能再使用Xcode 11.1的用户:

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

对于使用storyboard的用户:

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

<年代>

对于那些熟悉方法转换的人(Objc和动态行为)

前往@aftab穆罕默德汗 回答Objective-C@MikRo 答案为Swift改编版本 < / s > < / p >

不要再这样做了:

即使这最后两个旋转的变通方法没有使用苹果私有API,他们在AppStore中会被拒绝,因为Apple将不接受Xcode版本低于11.2.1的版本!

再说一次:

2019年11月5日,苹果公司已弃用Xcode 11.2

< >强更新解决方案: 更新到< em > Xcode 11.2.1 < / em >。对于我来说,它可以在iOS 11、12或13设备上运行

参考苹果的文档 此更新修复了一个可能导致使用UITextView的应用程序崩溃的关键问题

< em >旧的解决方案: 从https://developer.apple.com/download/more/下载Xcode 11.1 从11.2切换回11.1修复了崩溃

而且,对我来说,即使我使用的是Xcode 11.2,当我将iPhone升级到13.2时,崩溃问题也得到了解决。

一个更快的解决方法:

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

注意:你将失去在故事板中创建的所有属性。这可能会产生严重的影响(例如委托设置、大小等)。

这是Xcode 11.2的一个bug。子类textview在所有没有安装新iOS版本(13.2)的设备上崩溃。您可能最好不要用那个版本构建一个发行版。

你现在可以:

  • 把Xcode降级到11.1或者
  • 把你的设备升级到iOS 13.2

改进@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)
}
}
}

祝贺

Xcode的新版本(11.2.1)现在已经可用,这是摆脱这个问题的最好方法。

解决方法

@Mojtaba Hosseini我提出的解决方案是通过StackOverflow帮助和参与我的开发伙伴。你、我和所有其他开发者都知道,当苹果发布新版本时,这个问题就会消失。

除了一切

前面提到的解决方案肯定被Apple Review接受了,因为它完全不涉及私有API。这种方法非常类似于创建属性

@界面UITextView(布局)

UITextView + Layout.h

因此,当你创建属性时,你直接使用APPLE私有组件,并根据你的需要重新模块化它们。

简单的例子是AMFNetworking类

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

希望我的指控已经结束了

下面的答案只是我的一些帮助,让开发者能够继续开发,因为我们最初建议开发者回滚Xcode。再次下载8gb的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

在app委托中执行它

#import "UITextViewWorkaround.h"


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


[UITextViewWorkaround executeWorkaround];
return yes;
}

编译代码,你将有一个运行的应用程序:)

我已经适应了khan的Obj-C解决方案斯威夫特:

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


}

AppDelegatedidFinishLaunchingWithOptions的末尾调用它。

谢谢@Aftab !

该问题已在Xcode 11.2.1中修复。

编辑:修复现在已经发布,你应该切换到Xcode版本和注释掉这个解决方案。Mojtaba Hosseini在他的答复中提到:

... 这最后两个灵活的变通方法使用了苹果私有API,将被苹果审查拒绝!

在苹果发布修复之前,这是一个继续开发和测试的好办法。


对于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()
}

我使用了一个成功的变通方法,但很痛苦。以下是我遵循的流程:

  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替换。否则,这就站不住脚了。

你可以从苹果开发者网站下载最新的Xcode测试版(11.2.1 GM)。

这里的直接链接 .

Xcode 11.2.1 GM seed

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

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

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

发布说明确认它修复了这个错误:

enter image description here

我也有同样的问题,我只是把我的Xcode 11.2升级到11.2.1,它工作得很好。

升级后,我在iOs 13和iOs 12上测试了同样的功能,效果很好。

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

此更新修复了一个可能导致使用UITextView的应用程序崩溃的关键问题

Xcode发布说明截图

1. 问题:

Xcode 11.2有一个问题,其中包含UITextView的storyboard如果用Xcode 11.2编译,会导致应用在iOS 13.2之前的操作系统版本上崩溃。

Xcode 11.2

检查这个苹果公司的文档

2. 解决方案:

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

Xcode 11.2.1是专门解决这个崩溃问题的。

enter image description here 检查苹果公司文档。

3.建议:

我建议你使用最新版本的Xcode 11.3,因为它支持为iOS 13.3开发应用程序,而且有很多新功能。 检查苹果公司的文档.

.

.