gpt4 book ai didi

swiftui - 在 SwiftUI (tvOS) 中获取按钮的 onFocusChange 回调

转载 作者:行者123 更新时间:2023-12-05 02:43:03 24 4
gpt4 key购买 nike

focusable(_:onFocusChange:) 修饰符中的 onFocusChange 闭包允许我在 subview 获得焦点时为父 View 设置属性,如下所示:

struct ContentView: View {
@State var text: String
var body: some View {
VStack {
Text(text)
Text("top")
.padding()
.focusable(true, onFocusChange: { focused in
text = "top focus"
})
Text("bottom")
.padding()
.focusable(true, onFocusChange: { focused in
text = "bottom focus"
})
}

}
}

但在引入 focusable 的 2020 WWDC 视频中,明确指出此包装器不打算用于本质上可聚焦的 View ,例如按钮和列表。如果我在这里使用 Button 代替 Text onFocusChange 工作,但 Buttons 的正常焦点行为中断:

struct ContentView: View {
@State var text: String
var body: some View {
VStack {
Text(text)
Button("top") {}
.padding()
.focusable(true, onFocusChange: { focused in
text = "top focus"
})
Button("bottom") {}
.padding()
.focusable(true, onFocusChange: { focused in
text = "bottom focus"
})
}

}
}

有没有什么通用的方法可以让 onFocusChange 闭包与 Button 一起使用而不破坏它们正常的可聚焦行为?还是有其他方法可以做到这一点?

最佳答案

尝试在 ButtonStyle 中使用 @Environment(\.isFocused).onChange(of:perform:):

struct ContentView: View {
var body: some View {
Button("top") {
// button action
}
.buttonStyle(MyButtonStyle())
}
}

struct MyButtonStyle: ButtonStyle {
@Environment(\.isFocused) var focused: Bool

func makeBody(configuration: Configuration) -> some View {
configuration.label
.onChange(of: focused) { newValue in
// do whatever based on focus
}
}
}

在 ButtonStyle 中使用 @Environment(\.isFocused) 的 IIRC 可能只适用于 iOS 14.5+,但您可以创建自定义 View 而不是 ButtonStyle 以支持旧版本。

关于swiftui - 在 SwiftUI (tvOS) 中获取按钮的 onFocusChange 回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67092580/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com