【问题标题】:SwiftUI sheet infinite loop?SwiftUI 工作表无限循环?
【发布时间】:2021-11-20 22:20:59
【问题描述】:

这是 SwiftUI 中的错误吗?如果您点击“测试”,它会进入一个循环,永远一张一张地张贴。我不明白为什么。

这发生在 iOS 和 iPadOS 15 上

struct ContentView: View {
    
    @State private var showSheet = false
    @State private var name: String = ""
    @FocusState private var isFocused: Bool
    
    var body: some View {
        VStack {
            Button("Test") { setState() }
        }
        .sheet(isPresented: $showSheet) {
            VStack {
                Text("\(showSheet.description), \(name)")
                TextField("folder name", text: $name)
                    focused($isFocused)
            }
        }
    }

    private func setState() {
        print("setState")
        showSheet = true
    }
}

【问题讨论】:

    标签: swiftui ios15


    【解决方案1】:

    这是一个错字,通常应该这样关闭,但我认为原因很有趣,值得在这里回答:

    struct ContentView: View {
        
        @State private var showSheet = false
        @State private var name: String = ""
        @FocusState private var isFocused: Bool
        
        var body: some View {
            VStack {
                Button("Test") { setState() }
            }
            .sheet(isPresented: $showSheet) {
                VStack {
                    Text("\(showSheet.description), \(name)")
                    TextField("folder name", text: $name)
                        focused($isFocused) //<-- THIS LINE IS MISSING A `.` -- it should be .focused($isFocused)
                }
            }
        }
    
        private func setState() {
            print("setState")
            showSheet = true
        }
    }
    

    因为您在focused 行上省略了.,所以focused 将返回ContentView 本身而不是TextField 上的修饰符。这意味着它将ContentView 的副本添加到TextField 下方的视图层次结构中(因为focused 返回self 的修改版本),而不是原地修改TextField

    这是导致循环的原因,但因为从技术上讲它是有效代码,它不会产生编译器错误。

    【讨论】:

    • 哈!谢谢。我以前做过一两次同样的事情——在修饰符上省略了.,结果非常奇怪,很难追踪。我想知道编译器是否可以在这里提供帮助,并发出警告。
    • 是的,这是一个有趣的问题。我想如果您在层次结构中返回self 的副本,它可能会警告您,但实际上可能有这样做的正当理由(例如在视图修饰符代码中,而不仅仅是在视图本身中)。跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多