CollectionView Segue 在接收时发现 nil ViewController
CollectionView Segue finding nil on receiving ViewController
我有一个集合视图,它在其索引中选择一个项目并执行到下一个 ViewController 的 segue。当出现下一个ViewController时,我对象的值是nil
.
这是 collectionView 中的调用:
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
guard let adViewVC = storyboard?.instantiateViewController(withIdentifier: adViewPageID) as? AdViewPageVC else {return}
let adChoice = adArray[indexPath.row]
adViewVC.advertisement = adChoice
performSegue(withIdentifier: adViewPageSegue, sender: self)
}
注意 guard 语句正在执行,如果我从 adArray 打印一个值,它在此函数中具有值。
在我执行打开右边的 segue 之后 ViewController 广告对象总是 nil。
var advertisement : Advertisement!
override func viewDidLoad() {
super.viewDidLoad()
let title = advertisement.title
print(title)
}
即使在集合视图的 didSelectItem
函数赋值期间我可以看到它具有值,但它永远不会获取对象的值。
我在这里错过了什么?
您应该在 prepare(for:sender:)
函数中设置 advertisement
变量。您在 didSelect 函数中创建的视图控制器未被使用。
添加如下内容:
func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if let viewController = segue.destination as? PlayerViewController {
let adChoice = adArray[sender]
viewController.advertisement = sender as? STZMediaItem
}
}
并将您的 didSelect 函数更新为:
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
performSegue(withIdentifier: adViewPageSegue, sender: indexPath)
}
当用户点击 collectionViewCell 时,应用程序应使用 indexPath
作为发件人执行 segue:
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
performSegue(withIdentifier: adViewPageSegue, sender: indexPath)
}
并在 prepare(for:sender:)
方法中准备所有必要的东西。而且您不必从情节提要中初始化 viewController。 segue.destination
够了。
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if let identifier = segue.identifier {
if identifier == adViewPageSegue {
guard let adViewVC = segue.destination as? AdViewPageVC else {return}
let indexPath = sender as! IndexPath
let adChoice = adArray[indexPath.row]
adViewVC.advertisement = adChoice
}
}
}
我有一个集合视图,它在其索引中选择一个项目并执行到下一个 ViewController 的 segue。当出现下一个ViewController时,我对象的值是nil
.
这是 collectionView 中的调用:
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
guard let adViewVC = storyboard?.instantiateViewController(withIdentifier: adViewPageID) as? AdViewPageVC else {return}
let adChoice = adArray[indexPath.row]
adViewVC.advertisement = adChoice
performSegue(withIdentifier: adViewPageSegue, sender: self)
}
注意 guard 语句正在执行,如果我从 adArray 打印一个值,它在此函数中具有值。
在我执行打开右边的 segue 之后 ViewController 广告对象总是 nil。
var advertisement : Advertisement!
override func viewDidLoad() {
super.viewDidLoad()
let title = advertisement.title
print(title)
}
即使在集合视图的 didSelectItem
函数赋值期间我可以看到它具有值,但它永远不会获取对象的值。
我在这里错过了什么?
您应该在 prepare(for:sender:)
函数中设置 advertisement
变量。您在 didSelect 函数中创建的视图控制器未被使用。
添加如下内容:
func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if let viewController = segue.destination as? PlayerViewController {
let adChoice = adArray[sender]
viewController.advertisement = sender as? STZMediaItem
}
}
并将您的 didSelect 函数更新为:
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
performSegue(withIdentifier: adViewPageSegue, sender: indexPath)
}
当用户点击 collectionViewCell 时,应用程序应使用 indexPath
作为发件人执行 segue:
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
performSegue(withIdentifier: adViewPageSegue, sender: indexPath)
}
并在 prepare(for:sender:)
方法中准备所有必要的东西。而且您不必从情节提要中初始化 viewController。 segue.destination
够了。
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if let identifier = segue.identifier {
if identifier == adViewPageSegue {
guard let adViewVC = segue.destination as? AdViewPageVC else {return}
let indexPath = sender as! IndexPath
let adChoice = adArray[indexPath.row]
adViewVC.advertisement = adChoice
}
}
}