tvOS 中的一种方式 Segue

Posted

技术标签:

【中文标题】tvOS 中的一种方式 Segue【英文标题】:One Way Segue in tvOS 【发布时间】:2016-10-17 14:17:23 【问题描述】:

我有一个 Swift3 tvOS 应用程序,在其中我使用 performSegue(withIdentifier: ...) 从一个 ViewController 转换到另一个 ViewController。在第二个 ViewController 中,我使用带有 press.type == UIPressType.menu 的 pressesBegan 进行 UI 交互的菜单按钮。

如果直接输入第二个 ViewController(即默认的 ViewController),这可以正常工作,但随着过渡,当按下菜单按钮时,应用程序会再次显示第一个 ViewController(菜单在 tvOS 中兼作返回)。我的第二个 ViewController 也获得了密钥,但 UI 结果从未显示,因为第二个 ViewController 消失了。我尝试了不同的 segue 类型,但无济于事。

问题:

1) 有没有办法“消耗”菜单键事件,所以它永远不会到达操作系统?

2) 或者,我可以以某种方式制作“单向转场”吗?

3) 备选方案 2:我可以通过编程方式取消设置两个 ViewController 之间的关系吗?是什么让一个人成为另一个人的“父母”?我不使用导航控制器或任何东西,所以它必须是segue。

谢谢,

【问题讨论】:

这是一个简单的 XCode 8 问题,它显示了问题:drive.google.com/file/d/0B_LVxY3EYs6EOHRCTFpvZ3IzcG8/… 为什么不使用 UINavigationController? 如果它有效,那可能就结束了。我没有使用导航控制器,因为我只需要从一个 VC 转换到另一个 VC,然后在应用程序的剩余生命周期中一直呆在那里。 【参考方案1】:

如果您想在没有UINavigationController 的情况下实现这部分应用程序,您可以通过编程方式设置根UIViewController。首先,在Main.storyboard 中的ViewController2 中添加一些storyboard id。然后,替换这部分代码:

performSegue(withIdentifier: "toViewController2", sender: self)

let appDelegate = UIApplication.shared.delegate as! AppDelegate
let mainStoryBoard = UIStoryboard(name: "Main", bundle: nil)
let secondViewController = mainStoryBoard.instantiateViewController(withIdentifier: "ViewController2") as! ViewController2
appDelegate.window?.rootViewController = secondViewController

在第一个 UIViewController 出现后,您将看到第二个 UIViewController 和菜单按钮的处理程序将按您的意愿工作(无后退)。

【讨论】:

我最终使用了 UINavigationController,然后简单地使用了 self.navigationController.viewControllers = [self]

以上是关于tvOS 中的一种方式 Segue的主要内容,如果未能解决你的问题,请参考以下文章

tvOS SpriteKit 应用程序中的菜单按钮

Swift 4 - 如何从嵌套在 UICollectionViewCell 中的按钮以编程方式激活 segue

在同一个多平台(iOS、macOS、watchOS、tvOS)应用程序中支持不同的生命周期方法

以编程方式展开 Segue - 新的转折

tvOS 中的 AVPlayerViewController 下拉菜单

从 CollectionView Cell 以编程方式执行 Segue