使用多个 Segue |如何使用 Cell 数据来执行特定的 Segue

Posted

技术标签:

【中文标题】使用多个 Segue |如何使用 Cell 数据来执行特定的 Segue【英文标题】:Working with Multiple Segues | How to use Cell data to perform specific Segues 【发布时间】: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 是的,我今天回到这个问题并接受了答案。我确实修改了代码。检查下面 【参考方案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 中的同一位置获取相同的数据。我建议在那里做。您的单元格应仅包含正确呈现到屏幕所需的数据。

看看有没有帮助。

【讨论】:

以上是关于使用多个 Segue |如何使用 Cell 数据来执行特定的 Segue的主要内容,如果未能解决你的问题,请参考以下文章

没有情节提要的 TableView Cell 的 iOS Swift Segue

如何从 Table Cell 返回另一个 UIViewController

TableView、数组和segue

UITableView 不使用 Cell 作为发件人

Swift:选择 UICollectionViewCell(在 UITableViewCell 内)时如何使用 Segue

如何从 uitableview 单元格调用 segue