斯威夫特赛格瑞准备 - 从一个视图控制器将数据发送到另一个
问题描述:
我想从一个视图控制器移动到另一个,并发送用户名:点击我得到斯威夫特赛格瑞准备 - 从一个视图控制器将数据发送到另一个
func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) {
self.performSegueWithIdentifier("chosenPerson", sender: self)
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "chosenPerson" {
let chosenPerson = segue.destinationViewController as? chosenPersonViewController
let indexPaths = self.collectionView!.indexPathsForSelectedItems()!
let indexPath = indexPaths[0] as NSIndexPath
chosenPerson!.userID = self.usersArray[indexPath.row].userId
}
:“致命错误:意外发现零,而展开一个可选值“ 我做错了什么?
答
执行segue时,请将indexPath作为发件人并尝试使用此switch语句。如果在选择单元格时看到"unknown segue"
打印出来,则目标控制器的类型不是chosenPersonViewController
。
func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) {
performSegueWithIdentifier("chosenPerson", sender: indexPath)
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
switch (segue.destinationViewController, sender) {
case (let controller as chosenPersonViewController, let indexPath as NSIndexPath):
controller.userID = usersArray[indexPath.row].userId
default:
print("unknown segue")
break
}
}
答
一个可能的问题可能是您的故事板中没有将您的segue的标识符设置为“chosenPerson”。要解决这个问题,首先确保你的第一个和第二个视图控制器之间有一个segue,它可以通过控件从一个视图控制器拖动到另一个视图控制器来创建。
然后确保segue具有标识符,具体为:“chosenPerson”。要做到这一点:单击前两个视图控制器之间的segue,然后导航到属性选项卡,然后将标识符框设置为“chosenPerson”。将故事板保存到您的更改中,现在您应该可以使用该标识符调用prepareForSegue,而不会遇到致命错误。
答
如果你给赛格瑞在故事板不调用此self.performSegueWithIdentifier(“chosenPerson”,发件人:个体经营)didSelectItem
方法如果你给赛格瑞在故事板覆盖FUNC prepareForSegue - 此方法调用第一后didSelectItem调用
请参阅故事板一次(以下图片为样品)
我认为问题出在self.usersArray [indexPath.r嗷嗷] .userId愿这将返回零
Swift2:
self.performSegueWithIdentifier("chosenPerson", sender: self)
Swift3:
self.performSegue(withIdentifier: "chosenPerson", sender: self)
Swift2:
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "chosenPerson" {
let chosenPerson = segue.destinationViewController as? chosenPersonViewController
let indexPaths = self.collectionView!.indexPathsForSelectedItems()!
let indexPath = indexPaths[0] as NSIndexPath
chosenPerson!.userID = self.usersArray[indexPath.row].userId //May it found nil please re - check array values
}
Swift3:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "chosenPerson" {
let chosenPerson = segue.destination as! chosenPersonViewController
if let indexPath = collectionView.indexPathForSelectedItem {
chosenPerson!.userID = self.usersArray[indexPath.row].userId //May it found nil please re - check array values
}
}
}
哪一行运行中断? –
只需几个指示即可开始。尝试逐行浏览你的'if语句'中的行,以了解正在发生的事情。潜在的失败候选者是'self.collectionView!.indexPathsForSelectedItems()!'和'chosenPerson!.userID = self.usersArray [indexPath.row] .userId'因此试图证明'indexPathsForSelectedItems()'返回一些有用的东西,并且你的位置'indexPath.row'上的usersArray实际上包含了一些东西。 – pbodsk
chosenPerson!.userID = self.usersArray [indexPath.row] .userId - 致命错误 –