使用没有 Storyboard Segues 的 UIViewControllerAnimatedTransitioning

Posted

技术标签:

【中文标题】使用没有 Storyboard Segues 的 UIViewControllerAnimatedTransitioning【英文标题】:Using UIViewControllerAnimatedTransitioning Without Storyboard Segues 【发布时间】:2017-05-07 05:31:14 【问题描述】:

我一直在尝试创建自定义转场转场,并一直在关注在线教程来帮助我。我在没有 Storyboard 的情况下以编程方式创建我的应用程序。

我有一个集合视图单元格,当我点击它时,我想要一个自定义动画过渡。当前的所有教程都使用 Storyboard segues。大多数教程将在情节提要上创建自定义转场,然后使用以下函数的一些变体来调用他们的自定义转场:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) 
    let vc = segue.destination as! ViewController
    let cell = sender as! PictureCell
    sourceCell = cell
    vc.picture = cell.picture.image


因为我没有使用故事板,所以我认为我必须在 didselectitem 函数中调用我的动画过渡:

 func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) 

我拥有所有自定义协议,并设置了我的 UINaviationDelegate 以包含自定义动画过渡:

extension FeedViewController: UINavigationControllerDelegate 
func navigationController(_ navigationController: UINavigationController, animationControllerFor operation: UINavigationControllerOperation, from fromVC: UIViewController, to toVC: UIViewController) -> UIViewControllerAnimatedTransitioning? 

    return PopInAndOutAnimator(operation: operation)



extension FeedViewController: CollectionPushAndPoppable 

var collectionView: UICollectionView? 
    return ideasCollectionView


这是我学习的教程示例:http://www.stefanovettor.com/2015/12/25/uicollectionview-custom-transition-pop-in-and-out/

如何在没有情节提要的情况下调用我的自定义转场?

非常感谢您的帮助。在过去的一周里,我一直在试图解决这个问题。

谢谢

【问题讨论】:

据我所知,必须在情节提要中构建 segue,您还可以向它们提供标识符,您可以使用它来区分 segue。但我更喜欢使用 UINavigationController 而不是 Segue 处理它使用起来太方便了。 【参考方案1】:

正如您正确指出的,只有在使用情节提要时才能使用 Segue,因此准备 segue 不适用于 xibs

您已经创建并设置了UINavigationControllerDelegate,现在只想启动动画到另一个视图控制器。

因此,您只需在导航视图控制器上调用 push:

let vc = DetailViewController(nibName: "DetailViewController", bundle: nil)
self.navigationController.pushViewController(vc, animated: true)

此代码创建并显示DetailViewController 的实例(重命名为您使用的正确名称)。如果您正确设置导航视图控制器的委托,您的自定义动画将被应用。

【讨论】:

嗨@nef10 我已经尝试过了,但我不断收到以下错误:原因:'无法在捆绑中加载NIB:'NSBundle。我还有什么需要做的吗?我是否必须创建一个 nib 文件或更改某种设置? 你是如何定义你的 DetailViewController 的(不管你如何命名它)。如果你有一个 xib (=nib),那么代码应该可以工作。如果布局只在代码中完成,则需要使用普通的 init 方法。 如果您不使用 prepareForSegue 方法,您在哪里以及如何设置委托?

以上是关于使用没有 Storyboard Segues 的 UIViewControllerAnimatedTransitioning的主要内容,如果未能解决你的问题,请参考以下文章

不使用 Storyboard segues 的自定义视图转换 (Swift)

使用 Storyboard Segues 关闭弹出视图

Xcode 6 中 Mac OS 应用程序的 Storyboard segues

为presentViewController设置委托(例如不使用segues)

Xcode -(OC版)Storyboard教程 1.5:Segues的介绍

在没有 Segues 的故事板之间传递变量 - Swift