SwiftUI .focused() 视图修饰符不起作用 .onAppear

eme*_*hex 6 swift swiftui

我试图让新的 iOS 15.0.focused()视图修改器在 SwiftUI 视图出现时执行:

import SwiftUI

struct MainView: View {
    @State var subViewIsDisplayed = false
    var body: some View {
        VStack {
            Spacer()
            Button(action: { subViewIsDisplayed.toggle() }) {
                Text("Trigger SubView")
            }
            Spacer()
        }
        .fullScreenCover(isPresented: $subViewIsDisplayed) {
            SubView()
        }
    }
}

struct SubView: View {
    @Environment(\.dismiss) var dismiss
    @FocusState private var isFocused: Bool
    @State var text = ""
    
    var body: some View {
        VStack {
            HStack {
                Spacer()
                Button(action: { dismiss() }) {
                    Image(systemName: "xmark")
                }
            }
            Spacer()
            TextField("Please autofocus :(", text: $text)
                .focused($isFocused)
            Spacer()
        }
        .onAppear {
            self.isFocused = true
        }
    }
}

struct MainView_Previews: PreviewProvider {
    static var previews: some View {
        MainView()
    }
}
Run Code Online (Sandbox Code Playgroud)

在我的物理设备上,触发“SubView”不会调出键盘(正如我所期望的那样.focused)。我究竟做错了什么?

Iva*_*kiy 9

        .onAppear {
            DispatchQueue.main.async {
                isFocused = true
            }
        }
Run Code Online (Sandbox Code Playgroud)

DispatchQueue.main.async,一如既往,可以解决问题

在此输入图像描述

  • 加 1 对于图像。 (4认同)

Rob*_*b N 0

对我来说,这似乎是另一个 SwiftUI 错误。这是一个解决方法。

我对示例代码的所有更改都在onAppear闭包中。

i=7我正在让它在模拟器和设备上工作。

struct SubView: View {
    @Environment(\.dismiss) var dismiss
    @FocusState private var isFocused: Bool
    @State var text = ""
    
    var body: some View {
        VStack {
            HStack {
                Spacer()
                Button(action: { dismiss() }) {
                    Image(systemName: "xmark")
                }
            }
            Spacer()
            TextField("Please autofocus :(", text: $text)
                .focused($isFocused)
            Spacer()
        }
        .onAppear {
            Task {
                for i in 1...20 {
                    isFocused = true
                    if isFocused {
                        print("The set finally stuck. i=\(i)")
                        break
                    }
                    await Task.sleep(100_000_000)
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)