【问题标题】:SwiftUI .focused() View Modifier not working .onAppearSwiftUI .focused() 视图修改器不起作用 .onAppear
【发布时间】:2022-03-22 17:12:48
【问题描述】:

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

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()
    }
}

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

【问题讨论】:

  • 模拟器工作怎么样?
  • 我认为这是一个错误。我认为上周还有另一个类似的问题,该代码在我的 Macbook 模拟器上运行良好,但我的印象是它不适用于该 OP 的系统。我根本无法让这段代码工作。
  • iOS 15 已发布,但仍然无法使用。就像他们在发布之前甚至没有尝试使用自己的软件一样。

标签: swift swiftui


【解决方案1】:
        .onAppear {
            DispatchQueue.main.async {
                isFocused = true
            }
        }

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

【讨论】:

  • 图片加1。
【解决方案2】:

这对我有用

.onAppear {
    DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 0.7){
        isFocused = true
    } //Delayed execution of 0.7s
}

【讨论】:

  • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
【解决方案3】:

在我看来,这就像另一个 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)
                }
            }
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-29
    • 2020-10-05
    • 1970-01-01
    • 2021-09-17
    • 2021-01-05
    相关资源
    最近更新 更多