按下UITableViewCell时的UIViewController

时间:2017-01-18 03:37:55

标签: swift uitableview

我正在尝试创建一个应用,以便在按下UITableView中的单元格时,它会打开一个新的ViewController,其中包含之前在单击的初始单元格中使用的相同图像和标签。

这是我的细胞: My Cells 这是我正在使用的数组:

let alligator:NSArray = ["American Alligator","American Crocodile","Mugger Crocodile","Saltwater Crocodile"]

以下是numberOfRowsInSection and cellForRowAt

 public func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return(alligator.count)
}


public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell4 = tableView.dequeueReusableCell(withIdentifier: "cell4", for: indexPath) as! AlligatorViewCell
    cell4.alligatorImage.image = UIImage.init(named: alligator[indexPath.row] as! String + ".jpg")
    cell4.alligatorLabel.text = alligator[indexPath.row] as? String
    return(cell4)
}

以下是我的详细视图控制器的出口:

@IBOutlet var detailImage: UIImageView! @IBOutlet var detailLabel: UILabel!

这是didSelectRowAt

public func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    detailImage.image = UIImage.init(named: alligator[indexPath.row] as! String + ".jpg")!
    detailLabel.text = alligator[indexPath.row] as? String

问题是,当我按下单元格时,我收到错误fatal error: Unexpectedly found nil while Unwrapping Optional

1 个答案:

答案 0 :(得分:1)

我相信您的错误正在发生,因为调用它时detailImage不存在。

据我所知,这些插座位于基本视图控制器中,但它们指的是详细视图控制器中的对象,这是不允许的。因此,当你试着打电话给他们时,他们不会传递任何值为零的东西。

因此,它不是关于UIImage的初始化。

您需要在detailViewController类中创建IBOutlets,然后通过prepareForSegue函数将值从您的单元格传递到这些出口。

如果您对此有疑问,请与我们联系。

修改

让我们说你的详细视图控制器有detailImage属性,那么你可以这样做(在你的基础ViewController中)

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    let controller = segue.destination as! UIViewController //your detail controller
    controller.detailImage = myImage //where myImage is a property of your base view controller
}

修改

您可以在按照之前尝试过的单元格时在视图控制器中设置myImage属性。然后可以将myImage设置为prepareForSegue func中的detailImage。所以像这样:

public func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    myImage = UIImage.init(named: alligator[indexPath.row] as! String + ".jpg")!
    ...

修改

你应该像这样使用myImage

var myImage: UIImage?
public func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        myImage = UIImage.init(named: alligator[indexPath.row] as! String + ".jpg")!
        ...