实例化包含UIScrollView的Storyboard时,UIKit崩溃

问题描述 投票:0回答:1

我每个人,

我面临UIKit的一个奇怪问题,即我无法在每次启动应用时重现。问题非常简单:我有一个主ViewController和一个包含ViewController的孩子UIScrollView。您可以看到下图:

enter image description here

我添加子控制器的代码非常简单:

private func configureKeyboard() {
    guard let keyboardViewController = keyboardViewController else { return }

    addChild(keyboardViewController)

    keyboardContainerView.addSubview(keyboardViewController.view)
    keyboardViewController.didMove(toParent: self)
    keyboardViewController.view.translatesAutoresizingMaskIntoConstraints = false

    keyboardContainerView.topAnchor.constraint(equalTo: keyboardViewController.view.topAnchor, constant: 0).isActive = true
    keyboardContainerView.trailingAnchor.constraint(equalTo: keyboardViewController.view.trailingAnchor, constant: 0).isActive = true
    keyboardContainerView.bottomAnchor.constraint(equalTo: keyboardViewController.view.bottomAnchor, constant: 0).isActive = true
    keyboardContainerView.leadingAnchor.constraint(equalTo: keyboardViewController.view.leadingAnchor, constant: 0).isActive = true
}

但是行keyboardContainerView.addSubview(keyboardViewController.view)似乎导致崩溃:

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

所以看来scrollView是崩溃的原因。堆栈显示出它似乎落在了init(coder:)上。

enter image description here

这是我实例化KeyboardController的方式。在scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions)期间,控制器本身在协调器上启动:

class func controller(dataSource: KeyboardDataSource,
                      stackEditor: StackEditor,
                      onOperationTouch: @escaping (_ operation: CalculatorOperation) -> Void,
                      onShouldPresentSettings: @escaping () -> Void) -> KeyboardViewController {
    let controller: KeyboardViewController = UIStoryboard(name: "KeyboardViewController", bundle: nil).instantiateInitialViewController() as! KeyboardViewController
    controller.dataSource = dataSource
    controller.stackEditor = stackEditor
    controller.didTouchOperation = onOperationTouch
    controller.shouldPresentSettings = onShouldPresentSettings
    return controller
}

此崩溃有点让我想起了我们在早期版本的Xcode上使用UITextView导致的崩溃,它可能会导致崩溃。我在configureKeyboard上呼叫viewDidLoad()。将其放在viewDidAppear()上不能解决问题。我还应该说在应用程序上启用了Catalyst。但是我只在iOS应用程序上看到此崩溃。在Mac上完美运行。有时,清理构建文件夹并删除应用程序似乎可以解决此问题。但是我害怕在AppStore上部署这样的随机崩溃版本。这也发生在真实设备上。因此可能不是模拟器问题。另外,KeyboardController的情节提要文件已正确关联到iOS应用程序目标。 Apple Developer论坛上没有任何内容。我不知道。

有人遇到一些熟悉的问题吗?

感谢您的帮助。

swift crash storyboard uikit
1个回答
0
投票

经过大量测试,我发现显示带有Mac Catalyst特性的情节提要引起了问题。编译应用程序时,我必须将情节提要切换到iPhone或iPad特性。此后再也不会出现此问题。

© www.soinside.com 2019 - 2024. All rights reserved.