使用多个转场 |如何使用 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
或按照我的建议首先使用该方法进行工作。
我在集合视图中显示数据,我知道如何使用 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
...
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
或按照我的建议首先使用该方法进行工作。