我已经创建了模型类,并且我已经填充了一些静态图像和文本UICollectionView,但是当用户触摸单元格时,当我打印或在标签上显示时,它在视图控制器2中显示错误。下面是代码。
有什么建议吗?!
这是模型类
import Foundation
class Pokemon {
private var _name: String!
private var _pokedexId: Int!
// Setter And Getter
var name : String {
return _name
}
var pokedexId: Int {
return _pokedexId
}
// Initializer to initialize the data
init(name : String, pokedexId: Int) {
self._name = name
self._pokedexId = pokedexId
}
}
这是viewcontroller 1中的segue func
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "pokeSegue" {
if let detailVC = segue.destinationViewController as? ViewController2 {
if let poke = sender as? Pokemon {
detailVC.pokemon = poke
}
}
}
UICollectionView委托
func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) {
let poke: Pokemon!
if inSearchMode {
poke = filteredPokemon[indexPath.row]
} else {
poke = pokemon[indexPath.row]
}
print(poke.name)
performSegueWithIdentifier("pokeSegue", sender: self)
}
在viewController2中
import UIKit
class ViewController2: UIViewController {
var pokemon: Pokemon!
var receviceingString : String!
@IBOutlet weak var label: UILabel!
override func viewDidLoad() {
print(pokemon.name) //unexpectedly found nil while unwrapping an Optional value
}
}
答案 0 :(得分:3)
修改强>
在致电poke
时,使用self
作为发件人而不是performSegueWithIdentifier
:
performSegueWithIdentifier("pokeSegue", sender: poke)
原始回答
我假设你使用UICollectionViewCell
来触发segue。
如果是这样,let poke = sender as? Pokemon
将始终返回false
并被跳过,因为sender
将是触发segue的UICollectionViewCell
而不是{{1}的实例}}
您可以创建一个可以存储Pokemon对象的新类型Pokemon
,也可以只使用单元格的UICollectionViewCell
属性来存储引用的Pokemon的索引。
此值可以从tag
方法配置。
然后在collectionView(_ collectionView: UICollectionView,
cellForItemAtIndexPath indexPath: NSIndexPath)
方法中,您必须将sender对象强制转换为相关的prepareForSegue
类型,并使用您定义的信息检索Pokemon。