Xcode 11 无故崩溃 原因:xib _UITextLayoutView

崩溃信息如下:

*** Terminating app due to uncaught exception 
'NSInvalidUnarchiveOperationException', 
reason: 'Could not instantiate class named _UITextLayoutView because no class named _UITextLayoutView was found; 
the class needs to be defined in source code or linked in from a library (ensure the class is part of the correct target)'

解决方案:

解决方案 一

xib的部分视图改用硬核手写,以避坑。

解决方案 二

下载其他版本Xcode 传送门

解决方案 三

OC 黑魔法 Runtime

  • 创建 文件 UITextViewWorkaround

  • UITextViewWorkaround.h

#import 

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

  • UITextViewWorkaround.m
#import "UITextViewWorkaround.h"
#import  

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

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

}

参考

你可能感兴趣的:(Xcode 11 无故崩溃 原因:xib _UITextLayoutView)