我在集合视图中显示数据,我知道如何使用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的成员
有人有任何想法吗?
答案 0 :(得分:1)
假设您的集合视图中的项目可以重新安排(或者可能在将来的某个时间),indexPath
将不足以向您提供选择了哪个单元格的信息。因此,IMO你想给细胞一个属性的想法是可行的。
最简单的“快速和脏”方法是简单地将segue标识符字符串硬编码到您的单元格中。这不是最好的设计,因为您在应该知道彼此的应用程序元素之间引入依赖关系。
class MyCell : UICollectionViewCell {
var segue = "DefaultSegue"
}
现在在didSelectItemAtIndexPath
...
self.performSegueWithIdentifier(cell.segue, sender:cell)
当然最好使用enum
。更安全,更易读,更易于维护。
enum Segue : String {
case ToInfo = "SegueToInfo"
case ToLogin = "SegueToLogin"
// etc.
}
MyCell
的ivar现在为var : Segue = SomeDefaultValue
,你可以用同样的方式调用它。
BTW:关于你原来的问题,请注意以下几点:正如已经指出的那样,你不能下标一个单元格。 (UICollectionViewCell
不是Dictionary
,因此cell["key"]
没有意义。)另外,我不是在不止一个地方将单元格出列的粉丝 - 而是可以调用{{ 1}}或者首先在该方法中完成工作,正如我所建议的那样。
答案 1 :(得分:0)
您正在尝试索引UICollectionViewCell
,但当然该类不是数组,因此您无法“下标”它。
我的建议是重构你的代码。无论您在单元格中存储的数据是什么,您都可以从数据模型中获取数据,因为这是它最初的来源。你可能正在cellForIndexPath
中将它放在你的单元格中。
如果是这种情况,那么您无法从func ... shouldSelectItemAtIndexPath ... -> Bool
中的同一位置获取相同的数据。我建议在那里做。您的单元格应该只包含正确渲染到屏幕所需的数据。
看看是否有帮助。