在tableview单元格上执行segue时出现问题

时间:2016-12-25 00:14:34

标签: ios swift xcode tableview cell

我正在学习Swift并尝试在用户点击应用程序呈现的其中一个tableview单元格时执行segue。此刻,每当用户执行此操作时,下一个视图控制器都会成功加载,但由于某种原因,我似乎无法访问其任何UI元素,因为每次我尝试这样做时,我最终都会收到此错误:

致命错误:在解包可选值时意外发现nil

错误指向我尝试修改下一个视图控制器上显示的某个标签文本的行

这是 didSelectRowAt 功能:

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath){
    self.performSegue(withIdentifier: "segue1", sender: self)
}

这是 prepareForSegue 函数:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "segue1" {
        let destinationVC = segue.destination as! UserViewController
        let selectedRow = tableView.indexPathForSelectedRow!
        let selectedCell = tableView.cellForRow(at: selectedRow) as! CustomCell

        destinationVC.usernameLabel.text = selectedCell.userName.text //this is where the error is pointing to
        destinationVC.bioLabel.text = selectedCell.bio.text
        destinationVC.userImage.image = selectedCell.photo.image

    }
}

我不知道造成这个问题的原因。我的目标是将数据从tapped单元格传递给下一个视图控制器,但这显然阻止了我这样做。有谁知道我怎么解决这个问题?提前谢谢。

2 个答案:

答案 0 :(得分:2)

注意:我认为userNamebio都是UITextField s

为什么不尝试这样的事情?

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "segue1" {
        let destination = segue.destination as! UserViewController
        // Use of optional binding to make sure an indexPath exists
        if let indexPath = tableView.indexPathForSelectedRow {
            let cell = tableView.cellForRow(at: IndexPath(row: indexPath.row, section: indexPath.section)) as! CustomCell
            // Notice how we are not directly updating the label as before.
            destination.usernameText = cell.userName?.text
            destination.bioText = cell.bio?.text
        }
    }

}

现在位于UserViewController

@IBOutlet weak var usernameLabel: UILabel!
@IBOutlet weak var bioLabel: UILabel!
// What we will be passing the text to instead.
var usernameText: String?
var bioText: String?
override func viewDidLoad() {
    super.viewDidLoad()
    // update the labels with the text from the proper cell.
    usernameLabel?.text = usernameText
    bioLabel?.text = bioText
}

你可以为你的形象做同样的事情,只是不同的类型。这与在prepare(for segue:)中使用时未分配的插座有关。

答案 1 :(得分:0)

在使用UICollectionView尝试同样的事情时,我对准备segue方法有很大的问题。 2非常相似,因此您应该可以轻松地将collectionview更改为tableview。

这就是我所做的......使用变量selectedPack

在视图控制器中你想要转换为需要设置变量

// passed packName from PackViewController
var selectedPack: String!

然后在viewcontroller中选择单元格

public func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {

        // handle the segue to JourneyViewController with variable "selectedPack"
        // not sure why you need to set the storyboard but it works
    let storyBoard : UIStoryboard = UIStoryboard(name: "Main", bundle:nil)
        //create instance of the viewcontroller
    let transportJourneyViewController = storyBoard.instantiateViewController(withIdentifier: "JourneyViewController") as! JourneyViewController
        //value to pass - has been defined in journey
        transportJourneyViewController.selectedPack = INSERT_YOUR_VALUE_TO_PASS
        //present the vc
    self.present(transportJourneyViewController, animated:true, completion:nil)

}

JourneyViewController是您要在界面构建器中转到的.conset的storyboardID和ClassName。

您还需要在视图控制器的顶层和故事板本身中定义tableviewdatasource和tableviewdelegate。

class JourneyViewController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate {