从Xcode 11.1升级到Xcode 11.2后,我的应用崩溃了:
***由于未捕获异常'NSInvalidUnarchiveOperationException'而终止应用程序,原因:'无法实例化名为_UITextLayoutView的类,因为没有找到名为_UITextLayoutView的类;类需要在源代码中定义或从库中链接(确保类是正确目标的一部分)'
为什么会这样?我怎样才能防止这种崩溃?
从Xcode 11.1升级到Xcode 11.2后,我的应用崩溃了:
***由于未捕获异常'NSInvalidUnarchiveOperationException'而终止应用程序,原因:'无法实例化名为_UITextLayoutView的类,因为没有找到名为_UITextLayoutView的类;类需要在源代码中定义或从库中链接(确保类是正确目标的一部分)'
为什么会这样?我怎样才能防止这种崩溃?
当前回答
祝贺
Xcode的新版本(11.2.1)现在已经可用,这是摆脱这个问题的最好方法。
解决方法
@Mojtaba Hosseini我提出的解决方案是通过StackOverflow帮助和参与我的开发伙伴。你、我和所有其他开发者都知道,当苹果发布新版本时,这个问题就会消失。
除了一切
前面提到的解决方案肯定被Apple Review接受了,因为它完全不涉及私有API。这种方法非常类似于创建属性
@界面UITextView(布局)
Or
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
Then
创建文件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;
}
编译代码,你将有一个运行的应用程序:)
其他回答
这是Xcode 11.2的一个bug。子类textview在所有没有安装新iOS版本(13.2)的设备上崩溃。您可能最好不要用那个版本构建一个发行版。
你现在可以:
把Xcode降级到11.1或者 把你的设备升级到iOS 13.2
我已经将khan的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!)
}
}
}
}
在AppDelegate中的didFinishLaunchingWithOptions末尾调用它。
谢谢@Aftab !
我也有同样的问题,我只是把我的Xcode 11.2升级到11.2.1,它工作得很好。
升级后,我在iOs 13和iOs 12上测试了同样的功能,效果很好。
11.2.1转基因种子解决了这个问题
(它可以用来发布到App Store)
登录https://developer.apple.com/download/。下载Xcode 11.2.1转基因种子
发布说明确认它修复了此错误:
我使用了一个成功的变通方法,但很痛苦。以下是我遵循的流程:
在文本编辑器中打开XIB 找到违规的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>
注意它的id(在我的例子中:id="782-j1-88c") 如上面的答案所述,重写类并重新创建选项(我的是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;
}
注意包含文本视图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要替换。否则,这就站不住脚了。