来自 CollectionViewCell 的 Swift segue 无法显示新视图

Posted

技术标签:

【中文标题】来自 CollectionViewCell 的 Swift segue 无法显示新视图【英文标题】:Swift segue from CollectionViewCell failing to display new view 【发布时间】:2014-11-19 14:05:42 【问题描述】:

当我的CollectionView 中的一个单元格被选中时,我试图简单地加载一个新视图。

网上到处都说它就像在故事板中注册一个新视图和一个导航控制器一样简单,然后 Ctrl + 单击从我的CollectionViewCell 拖动到新视图。

完成此操作后,代码会编译并运行,但当我单击单元格时不会出现新视图。我错过了什么?

故事板说从CollectionView 到我的下一个视图(用正确的名称和所有标识)有一个转场,所以我有点困惑......

编辑:这是我的CollectionView 控制器代码,以防我在这里做了一些导致问题的事情。这是一个日历页面(您可能从代码中可以看出):

IBOutlet weak var calendarCollection: UICollectionView!
var collectionView: UICollectionView?
let calendarCellIdentifier: String = "calendarCell"

override func viewDidLoad() 
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
    let layout: UICollectionViewFlowLayout = UICollectionViewFlowLayout()
    layout.sectionInset = UIEdgeInsets(top: 50, left: 10, bottom: 10, right: 10)
    layout.itemSize = CGSize(width: 60, height: 60)
    collectionView = UICollectionView(frame: self.view.frame, collectionViewLayout: layout)
    collectionView!.dataSource = self
    collectionView!.delegate = self
    collectionView!.registerClass(UICollectionViewCell.self, forCellWithReuseIdentifier: calendarCellIdentifier)
    collectionView!.backgroundColor = UIColor.blackColor()
    self.view.addSubview(collectionView!)


// Return the collectionView cell at IndexPath
func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell 
    let cell: UICollectionViewCell = collectionView.dequeueReusableCellWithReuseIdentifier(calendarCellIdentifier, forIndexPath: indexPath) as UICollectionViewCell
    cell.backgroundColor = UIColor.blueColor()
    return cell


func collectionView(collectionView: UICollectionView, shouldHighlightItemAtIndexPath indexPath: NSIndexPath) -> Bool 
    return true


func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int 
    return challengeDurationDays

【问题讨论】:

检查你是否真的从单元格而不是视图本身创建了segue。您可以通过单击转场的圆圈来检查。如果单元格突出显示,则 segue 是正确的。如果整个视图被突出显示,则转场不正确。 单元格突出显示,所以不是这样。我的代码构建并运行,当我点击一个单元格时它什么都不做。 我假设你的 segue 是 push segue。如果是这样,视图控制器是否嵌入在导航控制器中? 我的故事板中有一个Navigation Controller,它在布局查看器中与视图控制器有连接。 Collection View 在其层次结构树中也有一个Navigation Item。看起来它嵌入正确? 是的。所以,这也不是原因。别的东西:当你将 segue 类型更改为模态时是否有效? 【参考方案1】:

我在使用 CollectionView 时遇到了类似的问题(在 ios 8 应用中使用 Xcode 6.1.1)。我在我的故事板中设置了一个从CollectionViewCell 到另一个ViewController 的segue,但是当单元格被触摸时它不会自动工作。此外,我将CollectionViewCell 子类化,将故事板中单元格的类设置为我的自定义类(MazeCollectionViewCell),并在我的类中建立IBOutlets,连接到我放置在故事板单元中的图像和标签。但是,当我尝试在 collectionView cellForItemAtIndexPath 方法中访问图像和/或标签时,它们是 nil。

当我从 viewDidLoad 方法中删除registerClass 调用时,我的所有问题都得到了解决[在我的例子中,我删除了collectionView!.registerClass(MazeCollectionViewCell.self, forCellWithReuseIdentifier: reuseIdentifier)]。就是这样!

我的猜测registerClass 调用导致CollectionViewController 创建我指定的类的空白副本并忽略情节提要中的模板(因此我的segue 和我的出口连接在为集合创建的单元格中无效)。

如果有人有进一步的见解,我很想听听,但这是对我有用的解决方案。

【讨论】:

【参考方案2】:

对于任何有类似问题的人,我通过使用didSelectItemAtIndexPath 方法手动触发segue 解决了这个问题。我认为我不应该这样做,但也许我误解了。要么是那个,要么是一个错误。我最后添加到CollectionViewController的方法是这样的:

func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) 
    performSegueWithIdentifier("dayViewSegue", sender: calendarCollection)

【讨论】:

以上是关于来自 CollectionViewCell 的 Swift segue 无法显示新视图的主要内容,如果未能解决你的问题,请参考以下文章

CollectionViewCell 问题。从 .xib 到自定义 collectionviewcell 的故事板转换

UITextView 避免 collectionViewCell 被点击

通过 UIButton 选择一个单元格 - CollectionViewCell - Swift

访问 CollectionViewCell

为啥不去 CollectionViewCell?

当自定义 collectionViewCell 中包含标签时,不会调用 didSelectItemAtIndexPath