我目前正在构建一个应用程序的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代码中使用手势识别器,但我知道情况可能不是这样。
谢谢
1条答案
按热度按时间9gm1akwq1#
在tvOS上,你可以使用
onExitCommand(perform:)
来检测菜单按下。这里是文档:https://developer.apple.com/documentation/swiftui/view/onexitcommand(perform:)