这是曾经在swift 5.1
上工作并在swift 5.2
中闯入的代码。我正在尝试设置一个首选项键值,以在其他地方使用按钮的框架:
struct SubmenuButtonPreferenceKey: PreferenceKey {
typealias Value = [CGSize]
static var defaultValue: Value = []
static func reduce(value: inout Value, nextValue: () -> Value) {
value.append(contentsOf: nextValue())
}
}
struct SubmenuButtonPreferenceViewSetter: View {
var body: some View {
GeometryReader { geometry in
Rectangle()
.fill(Color.clear)
.preference(key: SubmenuButtonPreferenceKey.self,
value: [geometry.frame(in: .local).size]) // crash here
}
}
}
public struct FloatingButton: View {
@State private var size = CGSize()
public var body: some View {
ZStack {
Button(action: {}) {
Text("a")
}
.background(SubmenuButtonPreferenceViewSetter())
}
.onPreferenceChange(SubmenuButtonPreferenceKey.self) { rect in
if let r = rect.first {
self.size = r
}
}
}
}
struct ContentView : View {
var body: some View {
return NavigationView {
VStack {
FloatingButton()
}
}
}
}
它崩溃
前提条件失败:输入索引无效:2
如果我将此写入控制台,则会显示很多错误,但随后会显示正确的框架
po geometry.frame(in: .local)
=== AttributeGraph: cycle detected through attribute 1144 ===
=== AttributeGraph: cycle detected through attribute 995 ===
...more of these errors...
=== AttributeGraph: cycle detected through attribute 1007 ===
▿ (0.0, 0.0, 160.0, 45.0)
▿ origin : (0.0, 0.0)
- x : 0.0
- y : 0.0
▿ size : (160.0, 45.0)
- width : 160.0
- height : 45.0
我尝试在放置GeometryReader的地方玩耍并调用首选项设置器,但除非完全删除首选项设置器,否则它始终会崩溃。
更新:更新了代码,现在它实际上崩溃了,对此感到抱歉。如果我删除VStack或NavigationView,它会停止崩溃,但是在那些地方都需要它们。
UPDATE2:提交了错误报告https://feedbackassistant.apple.com/feedback/7689920