设置首选项“前提条件失败:输入索引无效:2”时,SwiftUI崩溃

时间:2020-04-28 07:20:31

标签: ios crash swiftui

这是曾经在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

0 个答案:

没有答案