在 SwiftUI 中处理 tvOS 上的焦点事件更改

Jor*_*ndo 5 tvos swiftui

如何在 SwiftUI 中响应 tvOS 上的焦点事件?

我有以下 SwiftUI 视图:

struct MyView: View {
    var body: some View {
        VStack {
            Button(action: {
                print("Button 1 pressed")
            }) {
                Text("Button 1")
            }.focusable(true) { focused in
                print("Button 1 focused: \(focused)")
            }
            Button(action: {
                print("Button 2 pressed")
            }) {
                Text("Button 2")
            }.focusable(true) { focused in
                print("Button 2 focused: \(focused)")
            }
        }
}
Run Code Online (Sandbox Code Playgroud)

单击任一按钮即可正确打印。但是,在两个按钮之间更改焦点不会打印任何内容。

这个家伙正在对列表中的行做同样的事情,并说它开始为他使用 Xcode 11 GM 工作,但我使用的是 11.5,它绝对不起作用(至少不适用于按钮(或切换 - 我也尝试过) ))。

阅读文档,这似乎是解决此问题的正确方法,但它似乎实际上不起作用。我错过了什么,还是这只是坏了?

Ian*_*Ian 2

如果其他人偶然发现这个问题,答案是让您的视图以数据为中心

因此,如果您在滚动视图中有一个电影列表,您可以将其添加到外部视图中:

var myMovieList: [Movie];
@FocusState var selectedMovie: Int?;
Run Code Online (Sandbox Code Playgroud)

然后在你身体的某个地方:

ForEach(0..<myMovieList.count) { index in 
    MovieCard(myMovieList[i])
        .focusable(true)
        .focused($selectedMovie, equals: index)
}
Run Code Online (Sandbox Code Playgroud)

.focusable() 告诉操作系统该元素是可聚焦的,.focused 告诉它当绑定变量 ($selected) 等于传递给 equals 的值时使该视图聚焦:...

例如,在 tvOS 上,如果您将其包装在滚动视图中并按向左/向右,它将更改选择并更新 $selectedMovie 变量中的选定索引;然后,您可以使用它来索引您的电影列表以显示额外信息。

这是一个更完整的示例,它也将缩放所选视图:

https://pastebin.com/jejwYxMU