如何在 Storyboard 上创建 Segue,从以编程方式注册的 UICollectionViewCell 到新的 UIViewController?

Posted

技术标签:

【中文标题】如何在 Storyboard 上创建 Segue,从以编程方式注册的 UICollectionViewCell 到新的 UIViewController?【英文标题】:How to create a Segue on the Storyboard, from a programmatically registered UICollectionViewCell to a new UIViewController? 【发布时间】:2014-06-20 04:26:38 【问题描述】:

我在 Xcode 5.1.1 中使用 Storyboard,并且在那里有一个 UICollectionView。但是,那里的单元格实际上使用了一个 XIB(因此,没有显示在 Storyboard 上),然后以编程方式将其注册到 UICollectionView,如下所示:

UINib *nibHero = [UINib nibWithNibName:@"MTNNewsListHeroCell"
                            bundle:[NSBundle mainBundle]];    

[self.newsListCollectionView registerNib:nibHero
              forCellWithReuseIdentifier:@"heroCellID"];

到目前为止,一切都很好。一切正常。

接下来,我想创建一个从这个 UICollectionViewCell 到另一个 UIViewController 在故事板上的转场。这是一个非常标准的“点击项目,打开详细视图”功能。

通常,如果 Cell 存在于 Storyboard 上,在 UICollectionView 内,我可以在 Storyboard 上画一条线,从它到下一个 UIViewController 来创建 Segue。但是,Storyboard 上不存在该单元格(同样,因为单元格是作为 XIB 文件制作的):

目标只是让阅读我的代码的其他程序员可以使用 Storyboard 更好地理解应用程序的流程。

是否可以在 Storyboard 上显示和创建 Segue,从以编程方式注册的 UICollectionViewCell(在我的示例中是 News List View Controller 的子视图的 UICollectionView 内部制作)到新的UIViewController(在我的示例中为 Single News 视图),并且该连接实际显示在 Storyboard 上

最终更新:

这就是我在听从用户@rdelmar 的建议后最终做的事情。我认为它做得很好:

【问题讨论】:

您可以将 segue 从 viewController(NewListViewController) 添加到另一个 viewController(SingleNewsViewController) ,为其提供标识符并在选择 Cell 时调用 performSegueWithIdentifier:。 【参考方案1】:

不,你不能那样做。 segue 基本上是从一个视图控制器到下一个视图控制器的转换的视觉表示。您需要在情节提要上直观地表示该转场的两端才能制作一个。您可以将一个单元格添加到您的集合视图中并将一个 segue 连接到它只是为了显示情节提要中的流程,但它永远不会被调用,因为您在集合视图中实际拥有的单元格将是从 xib 文件创建的(我' 不确定这是否会让查看您的代码的人更清楚)。如果您真的想要一个实际运行的 segue,那么请在情节提要中制作单元格。

【讨论】:

您的回答对我来说很有意义。我认为“在你的集合视图中添加一个单元格并将一个 segue 连接到它只是为了显示流程”的想法是一个很好的想法,就我的目的而言。然后我会在新的视图控制器中添加一些文本来解释一切是如何只是一个虚拟的。 @hfz 我认为你关心这个真的很好,大多数开发人员会忽略这样的问题。可读性和可理解性是应该给予更多价值的东西! :)【参考方案2】:

如果以后有人需要这个,可以有解决方法。

在collectionview或collectionviewcontroller中:

private var onSelectionChangeListener:(()->Void)? = nil;

override func collectionView(collectionView: UICollectionView, shouldSelectItemAtIndexPath indexPath: NSIndexPath) -> Bool 
    if onSelectionChangeListener != nil                
        onSelectionChangeListener!();
    

    return true;


func setSelectionChangeListener(listenerMethod:(()->Void)) 
   onSelectionChangeListener = listenerMethod;

这样您的收藏视图就可以理解有一个选择。你可以从这里继续前进。在您的自定义 listenerMethod 中,您可以调用 segue 而不是在单元格中。

您可能需要更改方法签名(而不是 ()-Void )以获取与哪个单元格交互。

【讨论】:

以上是关于如何在 Storyboard 上创建 Segue,从以编程方式注册的 UICollectionViewCell 到新的 UIViewController?的主要内容,如果未能解决你的问题,请参考以下文章

iOS如何获取对带有segue的storyboard容器中嵌入的视图控制器的引用?

如何在没有 segue 和 storyboard 编程的情况下传递数据?

使用 Storyboard 推动 segue

创建一个 segue 并通过 Swift 在两个视图控制器之间附加它?

Storyboard segue 有时会将我的视图控制器部分放在屏幕之外

加载没有 Segue 的视图表单 StoryBoard