我目前正在使用Swift为tvOS构建一个应用程序,遇到了一些困难。大部分应用程序已经使用SwiftUI编码完成。但是,现在我需要添加手势识别器来允许每个页面从遥控器中捕获按钮按下事件。
我有这两个文件,其中一个是手势识别器,可以捕获菜单按钮的按下事件,另一个控制应用程序的导航:
//
// AppNavigator.swift
//
import SwiftUI
struct NavigationItem {
var view: AnyView
}
final class NavigationStack: ObservableObject {
@Published var viewStack: [NavigationItem] = []
@Published var currentView: NavigationItem
init(_ currentView: NavigationItem ) {
self.currentView = currentView
}
@objc func pop() {
if viewStack.count == 0 {
return
}
let last = viewStack.count - 1
currentView = viewStack[last]
viewStack.remove(at: last)
}
func push(_ view: NavigationItem) {
viewStack.append(currentView)
currentView = view
}
}
struct NavigationHost: View {
@EnvironmentObject var navigation: NavigationStack
var body: some View {
self.navigation.currentView.view
}
}
//
// MenuButtonGesture.swift
//
import UIKit
class MenuButtonGestureRecogniser: UIGestureRecognizer {
override func reset() {
if state == .possible {
state = .failed
}
}
override func pressesBegan(_ presses: Set<UIPress>, with event: UIPressesEvent) {
guard let press = presses.first else {
return
}
if press.type == .menu {
state = .recognized
}
}
override func pressesCancelled(_ presses: Set<UIPress>, with event: UIPressesEvent) {
reset()
}
override func pressesEnded(_ presses: Set<UIPress>, with event: UIPressesEvent) {
reset()
}
}
每次按下菜单按钮时,我的目标是弹出当前视图,但我在SwiftUI中找不到有关tvOS按钮按下的任何内容,因此我的自定义手势识别器是用UIKit完成的。
如果有人能给我一些指导,告诉我如何将我的导航器转换为可以使用手势识别器的方法,那就太好了。请注意,应用程序的其余部分都是使用SwiftUI完成的(NavigationItem中的每个实例中的视图),因此任何更改都需要与之配合。
最好的解决方案是在SwiftUI代码中使用手势识别器,但我理解这可能不是情况。
谢谢。