PAYATHON 2026

iPadOS 26 中弹出视图的浮动数字键盘为何会导致 SwiftUI 崩溃?

数据小陈

结论

异常信息显示,崩溃发生在激活布局约束时:约束两端的 UIView 和 _UIRemoteKeyboardPlaceholderView 没有共同的视图祖先。结合复现条件,问题可能与 SwiftUI sheet、浮动键盘和数字键盘交互时的系统视图层级有关。目前的信息不足以确定根因,也无法确认某个版本能可靠修复此问题。报告中的更新显示,换用 Xcode 27.0 和 iPadOS 27 后,问题仍可能复现。

复现条件

示例将 .keyboardType(.numberPad) 的 TextField 放在 ScrollView 中,并通过 .sheet 展示。输入内容后,在浮动键盘和弹出数字键盘的状态下,多次点击输入框外部,可能触发类似异常:

NSGenericException: Unable to activate constraint ... because they have no common ancestor.

这条异常表明,约束引用了不同视图层级中的元素;但仅凭异常信息,无法判断问题来自应用代码还是系统组件。

可尝试的规避方式

目前没有证据表明存在确定的代码修复。可以先调整触发条件,看看是否能避免崩溃:

  1. 在复现设备上关闭浮动键盘,或避免以弹出形式显示数字键盘。
  2. 操作前主动收起键盘,避免键盘仍在切换时连续点击 sheet 外部。
  3. 临时移除 ScrollView,或将输入框移出滚动容器,逐项确认问题是否与这类视图组合有关。这只能帮助定位,不能视为已知修复。
  4. 在不同设备、模拟器和系统版本上重复测试,并记录设备型号、iOS 版本、Xcode 版本和复现频率。

如果应用提供明确的完成操作,可以使用 @FocusState,让用户点击时主动取消输入焦点:

import SwiftUI

struct PresentedView: View {
    @State private var text = ""
    @FocusState private var isTextFieldFocused: Bool

    var body: some View {
        ScrollView {
            VStack {
                TextField("Placeholder", text: $text)
                    .keyboardType(.numberPad)
                    .focused($isTextFieldFocused)

                Button("完成") {
                    isTextFieldFocused = false
                }
            }
            .padding(80)
        }
    }
}

这段代码提供了一个显式收起键盘的入口,可用于检查“先收起键盘再继续操作”是否能降低复现率,但不能保证修复系统视图层级导致的约束异常。

后续排查

如果问题仍能复现,可以保留最小示例和崩溃日志,记录每次操作的顺序,并向 Apple 提交反馈。报告中注明异常涉及 _UIRemoteKeyboardPlaceholderView,以及测试过的系统和 Xcode 版本,便于排查应用侧触发条件与系统行为的关系。

备注:内容仅供参考。