【发布时间】:2020-09-22 00:04:05
【问题描述】:
各位,
我在使用 UIKit 时遇到了一个奇怪的问题,我无法在每次应用启动时重现该问题。问题很简单:我有一个主ViewController 和一个包含UIScrollView 的子ViewController。如下图所示:
我添加子控制器的代码非常简单:
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:)。
这是我实例化KeyboardController 的方式。控制器本身在 scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) 期间在 Coordinator 上启动:
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 时发生的崩溃,这可能会导致崩溃。我在viewDidLoad() 上打电话给configureKeyboard。把它放在viewDidAppear() 上并不能解决问题。我还应该说在应用程序上启用了 Catalyst。但我只在 iOS 应用程序上看到这个崩溃。在 Mac 上完美运行。
有时,清理构建文件夹并删除应用程序似乎可以解决问题。但是我很害怕在 AppStore 上部署一个版本会发生这样的随机崩溃。这也发生在真实设备上。所以可能不是模拟器问题。
此外,KeyboardController 的 Storyboard 文件已正确关联到 iOS 应用程序目标。苹果开发者论坛上什么都没有。我想不通。
有人遇到过一些熟悉的问题吗?
提前感谢您的帮助。
【问题讨论】:
-
你是如何实例化keyboardViewController的?
-
嗨@RobertCrabtree 感谢您提供帮助。我编辑了帖子以添加有关如何实例化
KeyboardViewController的更多详细信息。
标签: swift crash storyboard uikit