【问题标题】:Working with Multiple Segues | How to use Cell data to perform specific Segues使用多个 Segue |如何使用 Cell 数据来执行特定的 Segue
【发布时间】:2015-07-18 00:55:28
【问题描述】:

我在集合视图中显示数据,我知道如何使用 prepareForSegue 函数传递数据,但我试图让应用程序根据单元格属性数据确定要使用哪个 segue。 (每个 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' 没有名为 Subscript 的成员

有人有什么想法吗?

【问题讨论】:

  • 这方面有进展吗?
  • @QED 是的,我今天回到这个问题并接受了答案。我确实修改了代码。检查下面

标签: ios swift core-data uicollectionview segue


【解决方案1】:

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

最简单的“快速而肮脏”的方法是简单地将 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 或在正如我所建议的那样,首先使用该方法。

【讨论】:

  • 抱歉延迟回复,我找到的正确呼叫是self.performSegueWithIdentifier(self.array[indexPath.row].segue, sender: cell) in didSelectItemAtIndexPath。 PS:我不确定我的问题是否有混淆,但我使用数组来显示数据。不管怎样,谢谢你,我已经成功了
【解决方案2】:

您正在尝试对 UICollectionViewCell 进行索引,但该类当然不是数组,因此您不能“下标”它。

我的建议是重构您的代码。无论您存储在单元格中的什么数据,您都可以从您的数据模型中获得,因为它最初是从哪里来的。你可能把它放在cellForIndexPath 的单元格中。

如果是这种情况,那么您没有理由不能从您的func ... shouldSelectItemAtIndexPath ... -> Bool 中的同一位置获取相同的数据。我建议在那里做。您的单元格应仅包含正确呈现到屏幕所需的数据。

看看有没有帮助。

【讨论】:

    猜你喜欢
    • 2017-02-09
    • 1970-01-01
    • 2021-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多