允许SwiftUI视图检测tvOS菜单按钮按下

icomxhvb  于 2023-03-22  发布在  Swift
关注(0)|答案(1)|浏览(116)

我目前正在构建一个应用程序的tvOS是Swift和有点卡住.应用程序的大部分已使用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代码中使用手势识别器,但我知道情况可能不是这样。
谢谢

相关问题