在详细视图控制器中查看错误

时间:2016-03-07 09:55:15

标签: ios swift segue

我已经创建了模型类,并且我已经填充了一些静态图像和文本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
    }

} 

1 个答案:

答案 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。