SwiftUI 工作表无限循环?

Rob*_*b N 1 swiftui ios15

这是 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
    }
}
Run Code Online (Sandbox Code Playgroud)

jn_*_*pdx 5

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

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
    }
}
Run Code Online (Sandbox Code Playgroud)

.因为您在行中省略了 a focused,所以正在返回其自身而不是 上的focused修饰符。这意味着它会将 的副本添加到下面的视图层次结构中(因为返回了 的修改版本),而不是就地修改 。ContentViewTextFieldContentViewTextFieldfocusedselfTextField

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