使用多个转场 |如何使用 Cell 数据执行特定的 Segues

Working with Multiple Segues | How to use Cell data to perform specific Segues

我在集合视图中显示数据,我知道如何使用 prepareForSegue 函数传递数据,但我试图让应用程序根据单元格 属性 数据确定要使用的转场。 (每个 segue 转到不同的视图控制器以显示相关信息。)

例如

如果 cell.type 等于 "1" 则执行 segueOne 如果它是 "2" 类型则执行 segueTwo.

我正在尝试做这样的事情;

 func collectionView(collectionView: UICollectionView, shouldSelectItemAtIndexPath indexPath: NSIndexPath) -> Bool {

    let cell = collectionView.dequeueReusableCellWithReuseIdentifier("Cell", forIndexPath: indexPath) as! CollectionViewCell

    if cell[indexPath].type = "1" {
        performSegueWithIdentifier("showPage1", sender: self)
    } else if self.cell[indexPath].type = "2" {
        performSegueWithIdentifier("showPage2", sender: self)
    } else { println("error when selecting cell to segue") }

}

但是我得到一个错误;

'CollectionViewCell' does not have a member named Subscript

有人有什么想法吗?

您正在尝试对 UICollectionViewCell 进行索引,但是 class 当然不是数组,因此您不能 'subscript' 它。

我的建议是重构您的代码。无论您在单元格中存储什么数据,您都可以从您的数据模型中获取,因为这是它最初的来源。您可能将其放入 cellForIndexPath.

中的单元格中

如果是这样,那么您就没有理由无法从 func ... shouldSelectItemAtIndexPath ... -> Bool 中的同一位置获取相同的数据。我建议在那里做。您的单元格应仅包含将其自身正确呈现到屏幕上所需的数据。

看看是否有帮助。

假设您的集合视图中的项目可以重新排列(或者可能在未来某个时间),indexPath 将不足以为您提供选择了哪个单元格的信息。因此,IMO 你给单元格一个 属性 的想法是可行的。

最简单的 "quick and dirty" 方法是简单地将 segue 标识符字符串硬编码到您的单元格中。这不是最好的设计,因为您在应该相互了解的应用程序元素之间引入了依赖关系。

class MyCell : UICollectionViewCell {
    var segue = "DefaultSegue"
}

现在在 didSelectItemAtIndexPath...

中调用适当的 segue 真的很容易
self.performSegueWithIdentifier(cell.segue, sender:cell)

当然最好使用enum。更安全、更具可读性和更好的可维护性。

enum Segue : String {
   case ToInfo  = "SegueToInfo"
   case ToLogin = "SegueToLogin"
   // etc.
}

MyCell 的 ivar 现在是 var : Segue = SomeDefaultValue,您可以用同样的方式调用它。


顺便说一句:关于您的原始问题,请注意以下几点:正如所指出的,您不能为单元格下标。 (UICollectionViewCell 不是 Dictionary,所以 cell["key"] 没有意义。)此外,我不喜欢在多个地方将单元格出列 - 相反你可以调用 cellForItemAtIndexPath 或按照我的建议首先使用该方法进行工作。