我正在学习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单元格传递给下一个视图控制器,但这显然阻止了我这样做。有谁知道我怎么解决这个问题?提前谢谢。
答案 0 :(得分:2)
注意:我认为userName
和bio
都是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 {