从Xcode 11.1升级到Xcode 11.2后,我的应用崩溃了:
***由于未捕获异常'NSInvalidUnarchiveOperationException'而终止应用程序,原因:'无法实例化名为_UITextLayoutView的类,因为没有找到名为_UITextLayoutView的类;类需要在源代码中定义或从库中链接(确保类是正确目标的一部分)'
为什么会这样?我怎样才能防止这种崩溃?
从Xcode 11.1升级到Xcode 11.2后,我的应用崩溃了:
***由于未捕获异常'NSInvalidUnarchiveOperationException'而终止应用程序,原因:'无法实例化名为_UITextLayoutView的类,因为没有找到名为_UITextLayoutView的类;类需要在源代码中定义或从库中链接(确保类是正确目标的一部分)'
为什么会这样?我怎样才能防止这种崩溃?
当前回答
该问题已在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()
}
其他回答
这是Xcode 11.2的一个bug。子类textview在所有没有安装新iOS版本(13.2)的设备上崩溃。您可能最好不要用那个版本构建一个发行版。
你现在可以:
把Xcode降级到11.1或者 把你的设备升级到iOS 13.2
作为一个“快速”修复,你可以直接从代码中添加UITextView,而不是通过IB,至少它对我有用。虽然从我的角度来看,最好回滚到以前的Xcode/等待新的。
更新的解决方案: 更新到Xcode 11.2.1。对我来说,它可以在iOS 11、12或13设备上运行。
参考苹果的文档 此更新修复了一个可能导致使用UITextView的应用程序崩溃的关键问题。
旧的解决方案: 从https://developer.apple.com/download/more/下载Xcode 11.1 从11.2切换回11.1修复了崩溃。
而且,对我来说,即使我使用的是Xcode 11.2,当我将iPhone升级到13.2时,崩溃问题也得到了解决。
我也有同样的问题,我只是把我的Xcode 11.2升级到11.2.1,它工作得很好。
升级后,我在iOs 13和iOs 12上测试了同样的功能,效果很好。
一个更快的解决方法:
///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。
注意:你将失去在故事板中创建的所有属性。这可能会产生严重的影响(例如委托设置、大小等)。