【问题标题】:Handling focus event changes on tvOS in SwiftUI在 SwiftUI 中处理 tvOS 上的焦点事件更改
【发布时间】:2022-05-10 05:35:58
【问题描述】:

如何在 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)")
            }
        }
}

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

This guy 正在对列表中的行做同样的事情,并表示它开始使用 Xcode 11 GM 为他工作,但我在 11.5 上,它肯定不起作用(至少不适用于按钮(或切换 -我也试过了))。

阅读the documentation,这似乎是解决此问题的正确方法,但它似乎并没有真正起作用。是我遗漏了什么,还是这只是坏了?

【问题讨论】:

  • 嗨!你找到解决办法了吗?我也遇到了同样的问题。
  • 不。我在某处(我不记得在哪里)读到一些东西,这表明某些控件根本无法聚焦——即使它们具有focusable 属性。我无法确认,但这里似乎确实如此。

标签: swiftui tvos


【解决方案1】:

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

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

var myMovieList: [Movie];
@FocusState var selectedMovie: Int?;

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

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

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

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

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

https://pastebin.com/jejwYxMU

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-08-17
    • 1970-01-01
    • 2021-04-22
    • 2022-08-23
    • 2023-01-25
    • 2011-02-10
    • 2020-01-19
    • 1970-01-01
    相关资源
    最近更新 更多